Node.js 如何在带超时的异步内中断/取消forEach循环

Node.js 如何在带超时的异步内中断/取消forEach循环,node.js,asynchronous,promise,Node.js,Asynchronous,Promise,我有一个类似[1,2,3,4,5,6,7,8,9,10]的数组。我想运行这个数组的forEach,每个项都有超时1s,如果当前项与条件匹配,则中断forEach。 我发现代码只适用于out async: var BreakException={}; 试一试{ [1,2,3,4,5,6,7,8,9,10].forEach(函数(el){ 控制台日志(el); 如果(el==6)抛出BreakException; }); }捕获(e){ 如果(e!==BreakException)抛出e; }您最

我有一个类似[1,2,3,4,5,6,7,8,9,10]的数组。我想运行这个数组的forEach,每个项都有超时1s,如果当前项与条件匹配,则中断forEach。 我发现代码只适用于out async:

var BreakException={};
试一试{
[1,2,3,4,5,6,7,8,9,10].forEach(函数(el){
控制台日志(el);
如果(el==6)抛出BreakException;
});
}捕获(e){
如果(e!==BreakException)抛出e;

}
您最好使用这样的递归函数,因为退出带有错误的
forEach
循环不是一个好做法:

const list=[1,2,3,4,5,6,7,8,9,10];
常量realtimePromise=(索引=0)=>{
返回新承诺((解决、拒绝)=>{
如果(index>list.length-1)拒绝(新错误(‘列表中没有项目’);
const currentItem=列表[索引];
console.log(当前项);
如果(currentItem==6)解析(currentItem);
else setTimeout(()=>{
解析(realtimePromise(++索引));
}, 2000);
});
}
realtimePromise()。然后(()=>{
log('----结束循环-----');

});您确实不应该将异常用作控制流。我建议使用一个常规的循环,在这个循环中你可以很容易地中断。而且,
setTimeout
不会返回承诺,因此
wait setTimeout
是没有意义的。