Skip to content

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

Posted on:2024年8月10日 at 17:06

在处理多个并发请求时,我们一般会用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的结果。

原文转自:https://fe.ecool.fun/topic/3526fff1-d92d-4568-b6dd-549bc6c2a92e