Javascript 闭包得到错误的值,如何解决它?

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

我已经创建了一个测试用例来解决我在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 (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;
}