当在JavaScript循环内使用callback时,有没有什么办法可以保存循环中更新的variables以便在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; } 

在调用callback函数的时候, variable将不可避免地成为所有callback函数的最后一个variables,而不是每个callback函数的一个variables。 我意识到我可以将variable传递给doSomething() ,然后将其作为callback的一部分传回,但doSomething()是外部库的一部分,我宁愿不要为此而弄乱源代码。

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

最好的,谢谢,
萨米

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

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

请注意,在立即调用的函数中,正在创build并返回的callback会将参数引用到函数v而不是外部variable 。 为了使这读得更好,我build议解压callback的构造函数作为命名函数。

 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)放置一个function(var)包装器,所以更新的代码如下所示:

 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 } 

希望这能帮助其他人在将来遇到这样的事情!

@ aparker42,我仍然喜欢听到你对我的问题的回答你的问题的评论,因为这仍然使我困惑。

编辑:当然,因为这是JavaScript,你不会想要使用var作为variables名称。