Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从回调中的循环捕获值_Javascript_Node.js_Closures - Fatal编程技术网

Javascript 从回调中的循环捕获值

Javascript 从回调中的循环捕获值,javascript,node.js,closures,Javascript,Node.js,Closures,我有一个执行异步get方法的循环,该方法在完成时调用回调。在回调中,我需要知道回调链接到哪个循环 我猜这可能与闭包有关,但我不太明白为了从for循环中捕获密钥需要做哪些更改 旁注:我知道通过Redis键循环通常是不好的做法,但在这种情况下只有少数几个键 let redisGetCallback = function(err, getResponse) { numberOfLoops++; let user = JSON.parse(getResponse); if(user.ui

我有一个执行异步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);
}
let redisGetCallback=function(err,getResponse){
numberOfLoops++;
让user=JSON.parse(getResponse);
if(user.uid==userInfo.uid){
user.grantedPermission=true;
让userserialized=JSON.stringify(用户);
redis.set(“!!需要来自forloopbelowhere!!”的键,用户序列化。。。。。
}else if(numberOfLoops==numberOfKeys){
cb(假);
}
};
for(设i=0;i
如果您想知道给定回调中
i
的值,请不要:

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

您将在回拨中获得正确的号码,即
number

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


请记住,您永远不知道调用回调的顺序,因此您的最后一个回调可能会首先被调用,如果您按运行顺序计算回调的数量,则不一定与注册顺序的回调的数量相同。

您应该遵守承诺。这是否正确?
对于(let i=0;i
谢谢,因此在每个循环中都会运行一个函数,其中传递了一个索引,该函数返回一个函数,其中包含redis希望回调的参数,但父函数中捕获的索引?我也知道回调可以以任何顺序发生,但您所说的回调次数并不一定是这样的与注册的回调次数相同?这是因为我们不能依赖实际回调的方法吗?@Si-N我的错误:“回调次数”应该是“回调次数”-很好的捕获。是的,您有一个函数,它接受一个参数
number
,并返回一个新函数,该函数接受一些其他参数,并且可以访问外部函数参数。箭头函数使
a=>b=>c
更容易,而不是
function(a){return function(b){return c;}
-在我的一个项目中,我有一个疯狂的例子,在这里,我在一行中定义了7个函数
for (let i = 0; i < keys.length; i++) {
  redis.get(keys[i], redisGetCallback(i));
}
let redisGetCallback = function(err, getResponse) {
};
let redisGetCallback = number => (err, getResponse) => {
};