【发布时间】:2011-05-28 17:45:33
【问题描述】:
我正在为 node.js websocket 聊天服务器编写以下代码,并且想知道 conn 周围的变量生命周期问题是什么。
// chat-server.js
// Joshua Marshall Moore
// 12/20/2010
var ws = require("../../lib/ws/server");
var server = ws.createServer();
conns = [];
server.addListener("connection", function(conn){
function runHandler(msg){
server.broadcast(JSON.stringify({"who": conns[conn], "when": Date.now(), "what": msg}));
}
function setupHandler(msg){
if(conns.indexOf(msg)==-1 && msg!="Server"){
// name has not been taken yet
conns[conn] = msg;
conn.send("name ok");
server.broadcast(JSON.stringify({
"who": "Server",
"when": Date.now(),
"what": msg + " has joined us"
}));
conn.removeListener("message": setupHandler);
conn.addListener("message": runHandler);
return;
}
conn.send("name taken");
}
conn.addListener("message", setupHandler);
});
server.addListener("close", function(conn){
server.broadcast(JSON.stringify({
"who": "Server",
"when": Date.now(),
"what": conns[conn] + " has left us."
}));
delete conns[conn];
});
server.listen(16007);
上面的代码将运行。服务器连接,提交名称,直到服务器说没问题。从客户端发送到服务器的任何消息都会中继到所有客户端。
我试图将连接用作稍后检索客户端先前提交的名称的密钥。 但是,当第二个客户端连接时,所有消息都会显示为来自最后一个连接的人。
我希望这里有人对 conn 变量在其整个生命周期中的作用域有所了解。 从外观上看,conn 是为服务器连接事件注册的匿名函数的本地函数。因此,在该匿名函数内部定义的函数本身可以访问 conn。
我更具体的问题是:每次建立新连接时都会调用匿名函数。这是否意味着每次发生这种情况时,函数 setupHandler 和 runHandler 都会使用与它们被调用的新连接相对应的 conn 副本,或者它们是否有机会相互混淆?
【问题讨论】:
标签: javascript node.js websocket