在javascript的循环中使用回调时,是否有任何方法可以保存循环中更新的变量以用于回调?

When using callbacks inside a loop in javascript, is there any way to save a variable that's updated in the loop for use in the callback?

本问题已经有最佳答案,请猛点这里访问。

假设我有以下几点:

1
2
3
4
5
for(var i = 0; i < length; i++){
  var variable = variables[i];
  otherVariable.doSomething(variable, function(err){ //callback for when doSomething ends
    do something else with variable;
  }

到调用回调时,variable将不可避免地成为所有回调的最后一个变量,而不是像我希望的那样,对每个回调都是不同的变量。我意识到我可以将variable传递给doSomething(),然后将其作为回调的一部分传递回去,但是doSomething()是外部库的一部分,我不想为此而乱弄源代码。

你们中那些比我更了解javascript的人是否知道还有其他方法可以做我想做的事情?

最好,谢谢,
萨米语


处理这种情况的一种常见方法(如果很难看的话)是使用另一个立即被调用的函数来创建一个范围来保存变量。

1
2
3
4
for(var i = 0; i < length; i++) {
  var variable = variables[i];
  otherVariable.doSomething(function(v) { return function(err) { /* something with v */ }; }(variable));
}

注意,在立即调用的函数内部,正在创建并返回的回调引用了函数v的参数,而不是外部variable的参数。为了更好地理解这一点,我建议将回调的构造函数提取为一个命名函数。

1
2
3
4
5
6
7
function callbackFor(v) {
  return function(err) { /* something with v */ };
}
for(var i = 0; i < length; i++) {
  var variable = variables[i];
  otherVariable.doSomething(callbackFor(variable));
}


好吧,我好像已经想清楚了。我需要做的是在otherVariable.doSomething()周围放置一个function(var)包装器,因此更新后的代码如下:

1
2
3
4
5
6
7
8
for(var i = 0; i < length; i++){
  var variable = variables[i];
  (function(var){ //start wrapper code
    otherVariable.doSomething(var, function(err){ //callback for when doSomething ends
      do something else with var; //please note that i'm dealing with var here, not variable
    }
  })(variable);//passing in variable to var here
}

希望这能帮助其他任何人在未来陷入这样的困境!

@阿帕克42,我还是很想在你的问题的评论中听到你对我问题的回答,因为这仍然让我困惑。

编辑:当然,因为这是javascript,所以您不想使用var作为变量名。