这是我的JS程序的简化。 mylist 是一个字符串数组, MyAsync 是一个函数,它接受一个对象并安排稍后调用所提供的回调。
for (var myindex = 0; myindex < mylist.length; myindex += 1) {
MyAsync(mylist[myindex], function () { alert(myindex); });
}
当 mylist 中有十个项目时,结果是两条警告信息,每条信息显示“10”。好的,它在循环结束后显然使用了 myindex 的值。所以我做了一点改变......
for (var myindex = 0; myindex < mylist.length; myindex += 1) {
var copyindex = myindex;
MyAsync(mylist[myindex], function () { alert(copyindex); });
}
现在,每个提醒显示“9”。
我如何安排回调函数,以便在调用 MyAsync 时知道 myindex 是什么?
异步,billpg。
答案 0 :(得分:0)
是的,作为评论和not making functions in a loop因为您遇到的原因。
我们可以使用递归函数:
var len = mylist.length;
function asyncLoop(index) {
MyAsync(mylist[index], function () {
if(index < len) {
asyncLoop(++index);
}
});
}
asyncLoop(0);
作为评论, - 同时将它们全部关闭*(* - 快速循环可以运行)。并跟踪数组计数 ...
function asyncDo(index) {
MyAsync(mylist[index], function () {
/* we have access to the array index here */
console.log(index);
});
}
for ( var i=0, len=mylist.length; i<len; ++i) { asyncDo(i); }
答案 1 :(得分:0)
你可以使用闭包来做到这一点:这里有一些我认为你想要的代码,打印出0 .. 9。
var funcs = [];
for(var i = 0; i < 10; i++){
funcs.push( (function(j){
return function(){
console.log(j);
};
})(i));
}
funcs.forEach(function(f){
f();
});
这个想法是,在返回要添加到列表中的函数时,当从参数构造到外部函数时,会捕获i
的值。
这是一篇SO帖子帮我解决了这个问题:JavaScript closures vs. anonymous functions