我有一个包含各种数据的大型数组,以及一个对数组执行一些基本但有些耗时的分析的函数。
我使用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循环后面的代码等待循环完成迭代,或者以其他方式循环遍历数组?
答案 0 :(得分:3)
JavaScript循环迭代是同步的,在您的代码中,您将始终在调用resolve
之前完成循环。
请注意,JavaScript也是单线程的,因此将其置于承诺中将不会使其在后台运行。在执行此循环时,UI仍然会在一段时间内没有响应用户。
您可以使用web workers将一些计算卸载到后台进程。
顺便说一下:找到第一个项目后你可以退出循环吗?如果没有,为什么不反向迭代(使用for循环,而不是数组反转)并在找到第一个项目时退出?在最坏的情况下,技术上仍然是O(N),但如果你尽快拯救,最好的情况是O(1)。
但是为了更有帮助,您需要提供有关正在发生的事情的更多信息。我建议在http://jsfiddle.net/上放一个小例子 - 这本身就是一个有用的练习。