如何从回调中访问父作用域。回调是函数(错误,obj)。 var to_user_id在所有迭代中都是相同的。看起来在完成所有迭代后处理回调,因此var to_user_id只是所有回调的一个值。
for(var i = 0, len = keys.length; i < len; i++) {
to_user_id = keys[i].replace('m', '')
client.get(keys[i], function (err, obj) {
//var not updating, why is both to_user_id=77
console.log("match: to_user_id=" + to_user_id + " from_user_id=" + obj)
var match = "match: to_user_id=" + to_user_id + " from_user_id=" + obj
io.emit(1, match);
});
}
输出
查看两次迭代的to_user_id为77。一个应该是6,最后一个应该是77.
匹配:to_user_id = 77 from_user_id = 77
匹配:to_user_id = 77 from_user_id = 6
client.get是一个redis函数,以防万一你想知道。
答案 0 :(得分:1)
您的client.get()
来电是异步的。因此,for循环在任何client.get()
回调执行之前完成。这意味着,在执行第一个to_user_id
回调时,keys[keys.length - 1].replace('m', '')
将设置为client.get()
。这就是为什么你在输出中看到相同的to_user_id
的原因。
此处的修复是使用闭包来捕获to_user_id
的当前值。最简单的方法是使用keys.forEach()
:
keys.forEach(function(key) {
to_user_id = key.replace('m', '')
client.get(key, function (err, obj) {
console.log("match: to_user_id=" + to_user_id + " from_user_id=" + obj)
var match = "match: to_user_id=" + to_user_id + " from_user_id=" + obj
io.emit(1, match);
});
});
答案 1 :(得分:1)
您必须创建闭包以保存i
变量的值。
for (var i = 0, len = 5; i < len; i++) {
(function(i, to_user_id) {
client.get(i, function(err, obj) {
io.emit("match: to_user_id=" + to_user_id + " from_user_id=" + obj)
});
}(i, keys[i].replace('m', '')));
}