Javascript(NodeJS)回调范围

天生的德鲁

如何从回调访问父作用域。回调是函数(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函数,以防万一。

mscdex

您的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章