同步forEach循环(等待它结束)
Synchronous forEach loop (wait for it to end)
Node.js中有一个函数,它接收一个数组并在其中循环,对每个元素进行一些耗时的计算。
这是一个超级简化版本的功能:
var analyze_data = function (data) {
data.forEach(function (elm) {
if (elm.myProp == true) {
return true;
}
});
return false;
}
本质上,如果元素的任何属性myProp
等于true,我希望函数返回true。如果没有任何元素满足此条件,则函数应返回false。
但是,代码从不等待forEach循环完成。换句话说,如果数组中的第100个元素满足条件,则函数应返回true。相反,它会跳到return false;
,并在forEach
循环结束之前返回false。
有解决办法吗?
编辑
所以我意识到我过于简化了我的问题——我实际上使用的是Node.js包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函数中返回值的问题,而不是在外部函数中返回。此外,请注意函数如何解析为元素本身,而不是true,否则为false。如果其中一个元素通过了条件,我实际上想返回一些相关的数据,否则为false,表示它们都失败了。
现在有什么想法吗?:p此外,感谢所有原创答案!
这不是同步/异步执行的问题。您所做的是在for-each回调中返回true(这对于analyze_data
函数是不可见的),然后在for-ech完成后返回false。
您需要使用Array.prototype.some
:
var analyze_data = function (data) {
return data.some(function (elm) {
return elm.myProp == true;
});
}
问题不在于forEach是异步的,因为它不是。但因为你把一个回报误认为另一个回报。
您从回调返回true
,而不是从主函数返回。
forEach调用forEach,因为它对数组中的每个元素都执行,所以不能在在中间停止。以下是文档摘录:
注意:没有办法停止或中断forEach循环。解决方案是使用Array.every或Array.some.
问题是您从内部函数返回true值,但没有在外部函数 现在你有两个功能: 编辑: 您现在(可能)正在解析为 当然,这似乎是你应该做的: 那么你可以做:var retVal = false;
data.forEach(function (elm) {
if (elm.myProp == true) {
retVal = true;
}
});
return retVal;
var analyze_data = ***function (data)*** {
data.forEach(***function (elm)*** {
if (elm.myProp == true) {
return true; //returns out of function(elm)
}
});
//the true value is gone - you didn't do anything with it
return false; //always returns false out of function(data)
}
data.forEach(function (elm) {
if (elm.myProp == true) {
resolve(elm);
}
});
resolve(false);
elm
,但之后总是解析为false
。我不能100%确定这种行为,但我猜后面的行为会覆盖第一个行为。所以,你需要再次检查:is_found = false;
data.forEach(function (elm) {
if (elm.myProp == true) {
resolve(elm);
is_found = true;
}
});
if (!is_found) {
resolve(false);
}
if (!is_found) {
reject(false);
}
promise.then(function(result) {
// do stuff since it found stuff :)
}, function(err) {
// do stuff since if didn't find anything :(
});
- Sequelize等待,直到循环通过回调结束
- JavaScript - 回调 - 等待多个函数结束
- 等待函数结束(在 async.series 中)无法按预期工作
- Javascript等待函数结束,包括来自node.js的异步MYSQL查询
- 等待异步 Javascript 函数结束检索结果(延迟?)
- 如何要求 javascript 等待执行外部应用程序结束
- 同步forEach循环(等待它结束)
- IE9 Javascript:等待,直到选择结束
- 等待多个元素的动画结束
- 如何在jquery中等待隐藏效果结束
- 如何在js中等待http调用结束
- 如何使用jQuery来等待CSS3转换的结束
- 等待JS函数中异步调用的结束.(jQuery.Deferred?)
- 当jQuery slideDown/slideUp悬停时,如何等待上一张幻灯片结束
- 等待循环结束并执行第二个函数
- Node.js回调,等待函数结束
- 如何“等待”?在jplayer中执行代码直到歌曲结束
- 设置DIV的大小,而不必等待页面加载结束
- 在JavaScript中,等待一个函数结束后再开始另一个函数
- 使函数等待/暂停;直到另一个结束