繁体   English   中英

Javascript(NodeJS)回调范围

[英]Javascript (NodeJS) Callback Scope

如何从回调访问父作用域。 回调是函数(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()回调之前完成。 这意味着,在执行第一个client.get()回调时, to_user_id将被设置为keys[keys.length - 1].replace('m', '') 因此,这就是为什么您在输出中看到相同的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);
  });
});

您必须创建闭包以保存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', '')));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM