如何知道async for循环何时完成

How to know when async for loop is done?

本文关键字:何时完 循环 for 何知道 async      更新时间:2023-09-26

我有一个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];
} 

如何判断每个函数是否已经完成?

一个增量

你可以添加一个递增的回调:

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++);

<标题>

Promises目前还没有得到很好的支持,但是你可以使用库。不过,它肯定会给你的页面增加一点体积。


一个很好的解决方案

(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)

许多库都有.all解析器:

    jQuery
  • q
  • 蓝鸟
  • 和更多- https://promisesaplus.com/implementations

你可以使用它们或者学习它们的源代码。

假设代码是函数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));
}

可查看回复数

对于每个响应,您可以增加计数器值,如果计数器值与someArray相同。