我在Node.js中有一个函数,它接受一个数组并在其中循环,对每个元素进行一些耗时的计算。Synchronous forEach循环(等待它结束)
这里的功能的超级简化版:
var analyze_data = function (data) {
data.forEach(function (elm) {
if (elm.myProp == true) {
return true;
}
});
return false;
}
从本质上讲,我希望函数,如果任何元素的属性myProp
的等于真返回true。如果没有元素满足这个条件,该函数应该返回false。
但是,代码永远不会等待forEach循环完成。换句话说,如果数组中的第100个元素满足条件,则函数应该返回true。相反,它会跳到return false;
,并在forEach
循环有时间完成之前返回false。
有没有解决方案?
编辑
所以我意识到,我过于简单化了我的问题 - 我实际使用Node.js package es6-promise,和我的代码看起来更像是这样的:
var analyze_data = function (data) {
return new Promise(function (resolve, reject) {
data.forEach(function (elm) {
if (elm.myProp == true) {
resolve(elm);
}
});
resolve(false);
});
}
所以在现实中,我没有返回forEach函数中的值而不是外部函数的问题。此外,请注意函数如何解析为元素本身而不是真,否则为false。如果其中一个元素通过了条件,我实际上想要返回一些相关数据,否则返回false以表明它们全部失败。
现在有什么想法? :p另外,感谢所有原始答案!
如果切换到诺言,你可以用'Q.all',例如。 https://github.com/kriskowal/q/wiki/API-Reference#promiseall – akonsu 2014-10-31 15:43:08
你只是在错误的地方返回真值,试着使用'Array.prototype.some' – micnic 2014-10-31 15:47:52