我有一个执行异步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);
}
答案 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
可以使用正确的号码。
当然,您的实现可能存在其他问题,因此您可能需要进行更多更改,但基本思路是,不要依赖全局变量,最好将正确的值作为参数传递。
请记住,您永远不知道将调用回调的顺序,因此可以首先调用您的上一个回调,如果您按照运行顺序计算回调的数量,则它不一定与按照注册顺序回拨的号码。