我有一个for循环,启动了数百个异步函数。一旦完成所有功能,我需要运行最后一个功能,但是我知道当所有功能都完成时我似乎无法理解它。
我已尝试过promises但是只要循环中的任何函数解析,我的promise函数就会完成。
for(var i = 0; i < someArray.length; i ++){
// these can take up to two seconds and have hundreds in the array
asyncFunction(someArray[i];
}
每个功能完成后如何判断?
答案 0 :(得分:4)
您可以添加一个递增的回调:
for (var i = 0; i < len; i++) {
asycFunction(someArray[i]);
asycFunction.done = function () {
if (i == someArray.length - 1) {
// Done with all stuff
}
};
}
这种方法更受某些开发人员的欢迎,但(可能)需要更长时间才能执行,因为它等待一个完成,再运行另一个。
var limit = someArray.length, i = 0;
function do(i) {
asyncFunction(someArray[i]);
asyncFunction.done = function () [
if (i++ == someArray[i]) {
// All done!
} else { do(i); }
}
}
do(i++);
目前还没有很好地支持Promise,但您可以使用库。不过,它会为您的页面增加一点点量。
(function (f,i) {
do(i++,f)
}(function (f,i) {
asyncFunction(someArray[i]);
asyncFunction.done = function () {
if (i++ === someArray.length - 1) {
// Done
} else { f(i) }
};
}, 0)
答案 1 :(得分:3)
许多图书馆都有.all
个解析器:
您可以使用它们或了解它们的源代码。
假设代码是函数体foo()
:
function foo() {
return Promise.all(someArray.map(function(item) {
//other stuff here
return asyncFunction(item, /* other params here */);
}));
}
或者,如果没有其他事情要做,也没有其他的参数可以通过:
function foo() {
return Promise.all(someArray.map(asyncFunction));
}
答案 2 :(得分:1)
您可以查看回复次数。
对于每个响应,您可以增加计数器值,如果计数器值与someArray.length相同,那么您可以假设所有异步功能都已完成并可以开始下一步。