【问题标题】:How to know when async for loop is done?如何知道异步 for 循环何时完成?
【发布时间】:2015-10-22 13:52:15
【问题描述】:

我有一个启动数百个异步函数的 for 循环。完成所有功能后,我需要运行最后一个功能,但我似乎无法知道所有功能何时完成。

我已经尝试过 Promise,但只要循环中的任何函数解析,我的 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];
} 

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

【问题讨论】:

标签: javascript loops promise


【解决方案1】:

增量

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

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)

【讨论】:

  • 我实际上尝试了您的第一个增量建议,我遇到的问题是 for 循环启动异步函数然后不等待并再次循环。因此,当 if 语句等于 true 时,它​​仅意味着循环已完成启动异步函数,而不是它们已完成。
  • @Skej 这正是第二个解决方案旨在解决的问题。尝试一下,希望它有效
  • 递归方法做到了。我曾想过,但它似乎是一种胶带解决方案,但如果它看起来很愚蠢并且有效,那它并不愚蠢。
  • @Skej 我添加了一个更好的非文档磁带解决方案。它使用匿名函数,无需大量修改即可重用
【解决方案2】:

很多库都有.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));
}

【讨论】:

    【解决方案3】:

    您可以查看回复的数量。

    对于每个响应,您可以增加计数器值,如果计数器值与 someArray.length 相同,那么您可以假设所有异步函数都已完成并可以开始下一步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多