以下代码是否等待forEach完成

时间:2014-11-04 20:52:05

标签: javascript arrays node.js foreach promise

我有一个包含各种数据的大型数组,以及一个对数组执行一些基本但有些耗时的分析的函数。

我使用forEach循环迭代数组。我希望函数在满足条件时返回特定元素,否则为false,使用Promises,因为函数可能需要相当长的时间才能完成:

var analyzeData = function (arr) {
    return new Promise(function (resolve, reject) {
        var answer = false;

        arr.forEach(function (elm) {
            if (elm.foo == true) {
                answer = elm;
            }
        });

        resolve(answer);
    });
}

我遇到的问题是我怀疑在forEach循环完成之前answer正在解决;即在forEach循环完成检查每个元素的foo属性之前,该函数解析为answer,默认为false。

有没有办法确保forEach循环后面的代码等待循环完成迭代,或者以其他方式循环遍历数组?

1 个答案:

答案 0 :(得分:3)

JavaScript循环迭代是同步的,在您的代码中,您将始终在调用resolve之前完成循环。

请注意,JavaScript也是单线程的,因此将其置于承诺中将不会使其在后台运行。在执行此循环时,UI仍然会在一段时间内没有响应用户。

您可以使用web workers将一些计算卸载到后台进程。

顺便说一下:找到第一个项目后你可以退出循环吗?如果没有,为什么不反向迭代(使用for循环,而不是数组反转)并在找到第一个项目时退出?在最坏的情况下,技术上仍然是O(N),但如果你尽快拯救,最好的情况是O(1)。

但是为了更有帮助,您需要提供有关正在发生的事情的更多信息。我建议在http://jsfiddle.net/上放一个小例子 - 这本身就是一个有用的练习。