从回调中的循环中捕获值

时间:2017-03-03 11:57:10

标签: javascript node.js closures

我有一个执行异步get方法的循环,该方法在完成时调用回调。在回调中,我需要知道回调链接到哪个循环。

我猜这可能与闭包有关,但是我真的不明白我需要更改以从for循环中捕获键。

附注:我知道通过Redis键循环通常是不好的做法,但在这种情况下只有少数几个键。

 let redisGetCallback = function(err, getResponse) {
  numberOfLoops++;
  let user = JSON.parse(getResponse);

  if(user.uid === userInfo.uid) {
    user.grantedPermission = true;
    let userSerialised = JSON.stringify(user);

    redis.set('!!NeedTheKeyFromTheForLoopBelowHere!!', userSerialised.....

  } else if (numberOfLoops === numberOfKeys) {
    cb(false);
  }
};

for (let i = 0; i < keys.length; i++) {
  redis.get(keys[i], redisGetCallback);
}

1 个答案:

答案 0 :(得分:1)

如果你想知道给定回调中i的值,那么而不是:

for (let i = 0; i < keys.length; i++) {
  redis.get(keys[i], redisGetCallback);
}

用:

运行它
for (let i = 0; i < keys.length; i++) {
  redis.get(keys[i], redisGetCallback(i));
}

并更改您的redisGetCallback

let redisGetCallback = function(err, getResponse) {
};

为:

let redisGetCallback = number => (err, getResponse) => {
};

并且您的回调中的number可以使用正确的号码。

当然,您的实现可能存在其他问题,因此您可能需要进行更多更改,但基本思路是,不要依赖全局变量,最好将正确的值作为参数传递。

请记住,您永远不知道将调用回调的顺序,因此可以首先调用您的上一个回调,如果您按照运行顺序计算回调的数量,则它不一定与按照注册顺序回拨的号码。