我有一个循环,执行一个异步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);
}
最佳答案
如果您想知道给定回调中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
。当然,实现过程中可能还存在其他问题,因此您可能需要进行更多更改,但是基本思想是,与其依赖于全局变量,不如传递正确的值作为参数更好。
请记住,您永远都不知道回调的调用顺序,因此您的最后一个回调可能会先被调用,如果按运行的顺序计算该回调的数量,则不一定与该回调的数量相同。按注册顺序进行回调。