js中多个请求并行,一个报错其他也能继续执行

如题:
用Promise.all的话一个失败就都失败了,还有别的方案吗?

阅读 2.6k
2 个回答

方法一

Promise.allSettled

举例,假如下面的 p2 失败(p1、p2、p3 都是 Promise 对象)

const allResult = await Promise.allSettled([p1, p2, p3])l
console.log(allResult.map(({ status }) => status));
// ["fulfilled", "rejected", "fulfilled"]

根据文档,对于 fulfilled 状态的,通过 .value 取值,rejected 的,通过 .reason 找原因。

方法二

如果浏览器版本还不够支持 allSettled,也可以自己处理,对每个要放入 Promise.all 的 promise 对象,都可以自己 catch 并处理掉错误,比如

const promises = [p1, p2, p3]
    .map(p => p.catch(() => Promise.resolve(null)));

const [r1, r2, r3] = Promise.all(promises);

这样如果 p2 出错,r2 就会是 null。当然要注意正常返回也有 null 的话要避免使用 null 作为错误返回值,可以改用 undefined。如果 undefined 也不能用,可以像 allSettled 那样把所有结果都封装成对象,比如

const promises = [p1, p2, p3]
    .map(p => p
        .then(value => ({
            status: "fulfilled",
            value,
        }))
        .catch(reason => ({
            status: "rejected",
            reason,
        }))
    );

已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题