/bin/www,websocketServer.js需要从/bin/www中的httpServer对象来初始化websocket服务器。如何不使用全局变量将httpServer传递给websocketServer.js?websocketServer.js:
let WebSocket = require('ws')
let wss = new WebSocket.Server({ server: global.httpServer })
wss.on('connection', (connection, req) =>
.../bin/www:
let app = require('../app')
let http = require('http')
...
global.httpServer = http.createServer(app)
httpServer.listen(port)
...foo.js和bar.js,它们都处理仅在运行时持久的用户信息(不需要存储在数据库中)。这两个文件如何与相同的用户一起工作?我只能考虑使用共享变量,也就是全局变量。在这种情况下,有没有办法避免使用全局变量?如果在我的脑海中使用全局变量是完全有意义的,那么我甚至应该避免使用这些变量吗?
此外,我遇到了需要运行时全局变量的情况,因为到目前为止,我一直在使用一个数据库,它本质上是全局变量的提供者。除了现在,我的项目需要的变量必须是全局的,但不需要存储在数据库中。foo.js:
...
function getsCalledWhenUserLogsIn(username)
{
global.users[username] = { timer: new Timer(), websocketConnection: null, ... }
// initializing the user below
...
}
...bar.js:
...
websocketServer.on('connection', (connection, req) =>
{
...
connection.on('message', (message) =>
{
let user = global.users[JSON.parse(message).username]
if (user)
{
user.websocketConnection = connection
...
}
...
}
...
}
...这不是我的代码本身,但至少它给了你一些想法。
我希望能够以一种不用使用全局变量的方式来构造我的文件。
发布于 2017-10-01 19:29:40
使用全局变量的示例:
global.bar = 'hello world';
function foo1() {
console.log(bar);
}
function foo2() {
console.log(bar);
}
foo1();
foo2();没有全局变量的示例:
var bar = 'hello world';
function foo1(bar) {
console.log(bar);
}
function foo2(bar) {
console.log(bar);
}
foo1(bar);
foo2(bar);这过于简单化,但要点是:如果您希望有两个不同的对象可以访问相同的对象而不知道对方,则需要“第三个东西”才能将该对象传递给前两个对象。
参见:依赖注入。
至于你是否应该一直这样做的问题.我认为,除非你有一个很好的理由不去做,否则你应该一直为避免全球化而努力。最佳实践是一个很好的默认,但如果常识要求您不应将其应用于特定情况,则可以打破它们。
但是,我认为你在这里没有足够的证据。你只需要更好地学习函数和参数。
发布于 2017-10-01 19:31:37
为了避免全局变量,您可以使用XMLHttpRequest,只需自己获取/发布即可。这不是最有效率的事情,但它仍然有效。
var xhr2 = new XMLHttpRequest();
xhr2.open('GET', "http://yourserver", true);
xhr2.onreadystatechange = function() {
if (this.status == 200 && this.readyState == 4) {
if(this.responseText == '') { return;}
//your code here
}//
};//end onreadystate
xhr2.send();您还可以拥有具有对象的全局数组,并且只需要遍历它们。那么你就有了一个数组。这取决于你想怎么做。
https://stackoverflow.com/questions/46516035
复制相似问题