在Node中,我有这个功能片段(从实际功能大大减少,所以希望我没有删除任何重要的东西):
Driver.prototype.updateDevices = function() {
for (ip in this.ips) {
var curIp = ip;
if (this.ips[curIp]) { // in case this.ips[curIp] is set to undefined...
http.get(
{ host: curIp,
port: 80,
path: '/tstat'
},
function (res) {
var result = '';
res.on('data', function (chunk) {
result += chunk;
});
res.on('end', function () {
// Want to parse data for each ip, but
// curIp is always the last ip in the list
});
}
);
};
};
};
我所拥有的是“Driver”对象,其中包含“ips”,一个包含ip地址列表的对象,例如{“192.168.1.111”:{stuff},“192.168.1.112”:{stuff} }
当然,这是非常明显的,我忽略了,但我不能按预期工作。显然,http.get()被异步调用多次。这就是我想要的;但是,当获得结果并且调用“结束”回调函数时,我无法访问“curIp”变量,我想要包含从中回调的特定请求的原始IP地址。相反,“curIp”变量始终包含“this.ips”中的最后一个ip地址。我错过了什么?任何帮助将不胜感激!
答案 0 :(得分:2)
curIp
不限于for
循环,它的范围限定为封闭的updateDevices
函数,因此它被所有http.get
调用共享,并且每次都被for
覆盖{1}}循环。
解决此问题的典型方法是创建一个立即函数,该函数创建自己的范围,可以捕获每个迭代的curIp
值作为该函数的参数:
if (this.ips[curIp]) {
(function(ip) { // Immediate function with its own scope
http.get(
{ host: ip,
port: 80,
path: '/tstat'
},
function (res) {
var result = '';
res.on('data', function (chunk) {
result += chunk;
});
res.on('end', function () {
// ip is the captured ipCur here
});
}
);
})(curIp); // Pass curIp into it as the ip parameter
};