【问题标题】:Does following code wait for forEach to finish以下代码是否等待 forEach 完成
【发布时间】:2014-12-31 21:53:57
【问题描述】:

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

我使用 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);
    });
}

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

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

【问题讨论】:

  • Array.prototype.forEach() 是同步的。所以它完成了对所有数组元素的迭代,然后解释器才评估下一条语句。
  • @zerkms 我也这么认为 - 任何想法为什么我会遇到这个问题?
  • @apparatix:我们不知道您遇到了什么问题。你应该create a Minimal, Complete, and Verifiable example
  • @apparatix:我不确定您指的是什么“问题”。此代码在 迭代完成后解析承诺。

标签: javascript arrays node.js foreach promise


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢德鲁的详细回答!问题实际上在于我之前进行的 API 调用:/ 另外,我使用 Promises 不是用于异步/后台计算,而是因为返回值可能无法立即获得 - 如果我只使用 return 函数有时评估为未定义
  • @apparatix,很高兴它有帮助。在您表明不需要承诺的情况下,除非您不想在以后开始计算。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 2020-12-20
  • 1970-01-01
  • 2014-05-27
  • 2018-09-20
  • 1970-01-01
相关资源
最近更新 更多