在处理多个并发请求时,我们一般会用Promise.all()
方法。
该方法指当所有在可迭代参数中的 promises
已完成,或者第一个传递的 promise(指 reject)失败时,返回 promise。
但是当其中任何一个被拒绝的话。Promise.all([..])
就会立即被拒绝,并丢弃来自其他所有promis的全部结果。
也就是说,promise.all
中任何一个 promise
出现错误的时候都会执行reject,导致其它正常返回的数据也无法使用。
如何让Promise.all在抛出异常后依然有效呢?
方案一
在promise.all队列中,使用map每一个过滤每一个promise任务,其中任意一个报错后,return一个返回值,确保promise能正常执行走到.then中。
var p1 = new Promise((resolve, reject) => {
resolve("p1");
});
var p2 = new Promise((resolve, reject) => {
resolve("p2");
});
var p3 = new Promise((resolve, reject) => {
reject("p3");
});
Promise.all([p1, p2, p3].map((p) => p.catch((e) => "出错后返回的值")))
.then((values) => {
console.log(values);
})
.catch((err) => {
console.log(err);
});
方案二
使用 Promise.allSettled
替代 Promise.all()
。
Promise.allSettled()
方法返回一个promise,该promise在所有给定的promise已被解析或被拒绝后解析,并且每个对象都描述每个promise的结果。