在javascript中使用循环内部的回调时,有没有办法保存在循环中更新的变量以便在回调中使用?

thi*_*ami 68 javascript callback

假设我有以下内容:

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;
  }
Run Code Online (Sandbox Code Playgroud)

在调用回调时,variable将不可避免地成为所有回调的最后一个变量,而不是每个回调的不同变量,正如我所希望的那样.我意识到我可以传递variabledoSomething()然后作为回调的一部分传回,但是它doSomething()是外部库的一部分,我宁愿不要乱用它的源代码.

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

最好的,谢谢,
萨米

apa*_*r42 52

处理这种情况的一种常见的,如果丑陋的方法是使用另一个立即调用的函数来创建一个范围来保存变量.

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

请注意,在立即调用的函数内部,正在创建并返回的回调将参数引用到函数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));
}
Run Code Online (Sandbox Code Playgroud)


thi*_*ami 38

好吧,我似乎已经明白了这一点.我需要做的是放一个function(var)包装器otherVariable.doSomething(),所以更新的代码如下所示:

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
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助其他人在将来遇到类似这样的事情!

@ aparker42,我仍然希望在你的问题评论中听到你对我的问题的回答,因为那仍然让我感到困惑.

编辑:当然,因为这是javascript,你不会想var用作变量名.

  • 在JavaScript中使用名为`var`的标识符可能不是一个好主意. (18认同)
  • 是的,这与我的答案基本相同.不同之处在于您使用立即调用的函数来创建一个范围,在该范围内您可以调用`doSomething`.我的回答刚刚在该范围内创建了回调,然后将其返回.最后他们都达到了同样的目的. (3认同)