如何解决有什么办法可以打破与Promise.all并行承诺数组的执行
我有并行线程,并且当其中一个抛出错误时想中断所有未完成的线程。 但是似乎所有其他线程仍在继续执行。
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个工作器仍然继续工作。 有什么办法打破他们吗?我只看到一种方法-在“测试”功能的catch“块”中调用process.exit,但是它将中断所有程序,而不是当前功能。
解决方法
您应该使用Promise.race: Promise.race()方法返回一个可实现或可拒绝的promise,可重复性中的一个promise中的一个promise都会具有该promise的值或原因。
查看更多https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。