当在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名称。