如何知道何时完成异步循环?

时间:2015-07-31 01:35:56

标签: javascript loops promise

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

每个功能完成后如何判断?

3 个答案:

答案 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相同,那么您可以假设所有异步功能都已完成并可以开始下一步。