问答题622/1593如何让Promise.all在抛出异常后依然有效

难度:
2022-08-07 创建

参考答案:

在处理多个并发请求时,我们一般会用Promise.all()方法。

该方法指当所有在可迭代参数中的 promises 已完成,或者第一个传递的 promise(指 reject)失败时,返回 promise。

但是当其中任何一个被拒绝的话。Promise.all([..])就会立即被拒绝,并丢弃来自其他所有promis的全部结果。

也就是说,promise.all 中任何一个 promise 出现错误的时候都会执行reject,导致其它正常返回的数据也无法使用。

如何让Promise.all在抛出异常后依然有效呢?

方案一

在promise.all队列中,使用map每一个过滤每一个promise任务,其中任意一个报错后,return一个返回值,确保promise能正常执行走到.then中。

1var p1 = new Promise((resolve, reject) => { 2 resolve('p1'); 3}); 4var p2 = new Promise((resolve, reject) => { 5 resolve('p2'); 6}); 7var p3 = new Promise((resolve, reject) => { 8 reject('p3'); 9}); 10Promise.all([p1, p2, p3].map(p => p.catch(e => '出错后返回的值' ))) 11 .then(values => { 12 console.log(values); 13 }).catch(err => { 14 console.log(err); 15 })

方案二

使用 Promise.allSettled 替代 Promise.all()

Promise.allSettled()方法返回一个promise,该promise在所有给定的promise已被解析或被拒绝后解析,并且每个对象都描述每个promise的结果。

最近更新时间:2024-08-10

赞赏支持

预览

题库维护不易,您的支持就是我们最大的动力!