我有并行线程,并且想要在其中一个引发错误时中断所有未完成的线程。但似乎所有其他线程都在继续执行。
async test() {
let threads = [];
console.log('Starting threads');
try {
for (let i = 0; i < 10; i++) {
threads.push(this.worker(i));
}
console.log(`Waiting for threads`);
await Promise.all(threads);
}
catch (err) {
console.log(err);
throw err;
}
}
async worker(i) {
// Sleep for 2 seconds to emulate API request
let p = new Promise((resolve, reject) => {
return setTimeout(
() => resolve(true),
2000
);
}
);
await p;
console.log(i);
throw 'Error';
}
我得到日志
0
Error
1
2
3
4
5
6
7
8
9
因此,当第一次调用“worker”函数(i=0)时抛出错误时,它会被函数“test”中的“catch”块捕获。然后和错误被抛出到上层函数,但其他 9 个工人仍然继续工作。有什么办法可以打破它们吗?我只看到一种方法-在函数“test”中的catch“block”中调用process.exit,但它会中断所有程序而不是当前函数。