在回调node.js中扩展变量

时间:2013-10-08 14:33:32

标签: javascript node.js


我有以下代码,它应该为TCP服务器的三个端口配置实现三个回调函数。控制台输出应报告它所设置的三个通道中的哪一个,但这并不是因为变量“i”的扩展是在回调的运行时完成的,因此得到i的最后一个值,即2。 /> 我的问题:当定义回调时,如何让节点扩展我的变量“i”?
感谢您提前帮助。


var p_arr = [   
    {src_port: 5500, src_host: "localhost", dst_port: 5501, dst_host: "localhost"},
    {src_port: 5502, src_host: "localhost", dst_port: 5503, dst_host: "localhost"},
    {src_port: 5504, src_host: "localhost", dst_port: 5505, dst_host: "localhost"},
];

for (var i in p_arr) {
    try {
        rcv_soc[i] = net.createServer(function (stream) {
            if (verbose & 1) console.log("Listening on host %s, port %s...", p_arr[i].src_host, p_arr[i].src_port);
            stream.on("data", function (data) {
                if (verbose & 4) console.log("Received from app %d: %s", i, data);
            });
        });

        rcv_soc[i].listen(p_arr[i].src_port, p_arr[i].src_host);
    }
    catch (err) {
        console.log("No connection possible !!");
    }
}

2 个答案:

答案 0 :(得分:1)

i作为参数在自动执行的函数中包装:

for (var i in p_arr) (function(i) {
try {
    rcv_soc[i] = net.createServer(function (stream) {
        if (verbose & 1) console.log("Listening on host %s, port %s...", p_arr[i].src_host, p_arr[i].src_port);
        stream.on("data", function (data) {
            if (verbose & 4) console.log("Received from app %d: %s", i, data);
        });
    });

    rcv_soc[i].listen(p_arr[i].src_port, p_arr[i].src_host);
}
catch (err) {
    console.log("No connection possible !!");
}
})(i)

答案 1 :(得分:0)

这是由于Javascript中的范围规则。

最简单的解决方案是使用forEach为数组中的每个项创建一个新的(函数)作用域:

p_arr.forEach(function(entry, i) {
  // 'entry' is the same as 'p_arr[i]'
  ...
});