Javascript 闭包得到错误的值,如何解决它?
我已经创建了一个测试用例来解决我在socket IO中遇到的闭包问题。代码如下:Javascript 闭包得到错误的值,如何解决它?,javascript,node.js,closures,Javascript,Node.js,Closures,我已经创建了一个测试用例来解决我在socket IO中遇到的闭包问题。代码如下: var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); function Session (id) { console.log('before connection:', id); io.on('connection', function
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
function Session (id) {
console.log('before connection:', id);
io.on('connection', function (socket) {
console.log('in connection:', id);
socket.on('foo', function (){}) // just to keep it running as there is a listener
});
}
setTimeout(function () {
var client_id1 = get_client_id_from_database(); // returns 55
var session1 = new Session(client_id);
});
setTimeout(function () {
var client_id2 = get_another_id_from_database(); // returns 99
var session2 = new Session(client_id2);
});
问题在于线路:
console.log('before connection:', id);
及
现在,当我创建两个应用程序连接时,我得到以下输出:
before connection: 55
before connection: 99
in connection: 99
in connection: 99
不过,我希望55年有两条消息,99年有两条消息:
像这样的
有人知道如何解决这个关闭问题吗?显然,会话中的id被关闭了,我不知何故总是得到99个id。我自己找到了答案。问题是,在每个会话构造函数中,我都为“连接”添加了一个事件侦听器。第一个连接可以工作,但第二个连接将触发两个事件。第三个连接三个事件,以此类推 解决方案是将套接字保存在会话外部的全局变量中:
var connections = {};
function Session (id) {
console.log('before connection:', id);
connections[id] = socket;
}
io.on('connection', function (socket) {
connections[id] = socket;
}
你看过Resig的优秀教程了吗?您将学习如何处理此问题以及其他问题;当您的意思可能是var session1=newsessionclient_id1;显然,只有一个侦听器——io上最后一个“连接”的侦听器——会启动。问题与闭包无关。@DanD。我创建了两个到我的应用程序的连接,很抱歉忘记这么说。我是更新问题。两个连接都只导致最后一组侦听器启动。在这种情况下,正好是id为99的。为什么您要尝试两次侦听“连接”?
before connection: 55
before connection: 99
in connection: 99
in connection: 55
var connections = {};
function Session (id) {
console.log('before connection:', id);
connections[id] = socket;
}
io.on('connection', function (socket) {
connections[id] = socket;
}