如何从回调访问父作用域。回调是函数(err,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函数,以防万一。
您的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);
});
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句