一尘不染

在JavaScript循环中使用回调时,是否有任何方法可以保存循环中更新的变量以在回调中使用?[重复]

javascript

假设我有以下内容:

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将不可避免地成为所有回调的最后一个变量,而不是像我希望的那样为每个回调都不同。我意识到我可以传递variabledoSomething()回调doSomething()函数,然后将其传递回去,但它是外部库的一部分,因此我不想弄乱它的源代码。

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

谢谢,


阅读 244

收藏
2020-05-01

共1个答案

一尘不染

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

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

请注意,在立即调用的函数内部,正在创建并返回的回调将参数引用给函数,v而不是外部variable。为了使阅读效果更好,我建议将回调的构造函数提取为命名函数。

function callbackFor(v) {
  return function(err) { /* something with v */ };
}
for(var i = 0; i < length; i++) {
  var variable = variables[i];
  otherVariable.doSomething(callbackFor(variable));
}
2020-05-01