首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript (NodeJS)回调范围

Javascript (NodeJS)回调范围
EN

Stack Overflow用户
提问于 2014-11-08 19:40:02
回答 2查看 93关注 0票数 0

如何从回调访问父作用域。回调是函数(err,obj)。变量to_user_id在所有迭代中都是相同的。看起来,回调是在完成所有迭代之后处理的,因此var to_user_id只是所有回调的一个值。

代码语言:javascript
复制
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函数,如果您想知道的话。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-08 19:47:50

您的client.get()调用是异步的。因此,for-循环在执行任何client.get()回调之前完成。这意味着在执行第一个to_user_id回调时,client.get()将被设置为keys[keys.length - 1].replace('m', '')。这就是为什么在输出中看到相同的to_user_id的原因。

这里的修正是使用闭包来捕获to_user_id的当前值。最简单的方法是使用keys.forEach()

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-11-08 19:58:03

必须创建闭包以保存i变量的值。

代码语言:javascript
复制
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', '')));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26821278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档