Javascript 下面的代码是否等待forEach完成

Javascript 下面的代码是否等待forEach完成,javascript,arrays,node.js,foreach,promise,Javascript,Arrays,Node.js,Foreach,Promise,我有一个包含各种数据的大数组,还有一个函数,它对数组执行一些基本但有些耗时的分析 我使用forEach循环在数组上迭代。如果满足条件,我希望函数返回一个特定元素,否则为false,使用承诺,因为函数可能需要相当长的时间才能完成: var analyzeData = function (arr) { return new Promise(function (resolve, reject) { var answer = false; arr.forEach

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

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

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
正在被解决;i、 e.在forEach循环可以完成检查每个元素的
foo
属性之前,函数解析为
answer
,默认为false


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

JavaScript循环迭代是同步的,并且在代码中,您总是在调用
resolve
之前完成循环

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

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

旁白:当找到第一个项目时,你能退出循环吗?如果不是,为什么不反向迭代(使用for循环,而不是数组反转)并在找到第一项时退出呢?从技术上讲,在最坏的情况下仍然是O(N),但如果你尽快摆脱困境,最好的情况是O(1)


然而,为了更有帮助,您需要提供更多关于正在发生的事情的信息。我建议在上放一个小例子——这本身就是一个有用的练习。

Array.prototype.forEach()
是同步的。因此,它完成了对所有数组元素的迭代,只有在解释器对下一个语句求值时,它才会对下一个语句求值。@zerkms我也这么认为-你知道为什么我会遇到这个问题吗?@apparatix:我们不知道你遇到了什么问题。你应该这么做。@apparatix:我不确定你指的是什么“问题”。此代码在迭代完成后解析承诺。感谢您的详细回答!问题实际上在于我之前所做的API调用:/此外,我使用的承诺不是用于异步/后台计算,而是因为返回值可能不会立即可用-如果我只是使用
return
函数,有时会对其求值undefined@apparatix,很高兴这有帮助。在这种情况下,你不需要承诺,除非你不想在以后开始计算。