【发布时间】:2020-12-26 18:07:05
【问题描述】:
我有一个类似 [1,2,3,4,5,6,7,8,9,10] 的数组。我想运行这个数组的 forEach,每个项目都有超时 1s,如果当前项目符合条件,则中断 foreach。 我找到了仅适用于异步的代码:
var BreakException = {};
try {
[1,2,3,4,5,6,7,8,9,10].forEach(function(el) {
console.log(el);
if (el === 6) throw BreakException;
});
} catch (e) {
if (e !== BreakException) throw e;
}
但是当我使用异步时,它会运行所有项目:
var BreakException = {};
let list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var realtimePromise = new Promise((resolve, reject) => {
list.every(async(item, pKey) => {
await setTimeout(function() {
try {
console.log(item);
if (item === 6) throw BreakException;
} catch (e) {
if (e !== BreakException) throw e;
}
}, 2000 * pKey);
});
});
realtimePromise.then(() => {
console.log('------- End loop -------');
});
谁有这个问题的解决方案?
【问题讨论】:
-
你真的不应该使用异常作为控制流。我建议使用常规循环,您可以轻松地从中中断。
-
另外,
setTimeout不返回承诺,所以await setTimeout没有意义。
标签: node.js asynchronous promise