如何使用 JavaScript 的 Promise.allSettled() 函数

发布于 2023-02-02 21:56:58 字数 2023 浏览 92 评论 0

Promise.allSettled() 类似于 Promise.all() 有两个主要区别:

  • allSettled() 无论其中一项承诺是否被拒绝,都会解决
  • allSettled() 将返回一个对象数组,而不是一个数组,它包含 {status, value, reason} 描述每个承诺是被履行还是被拒绝。

回想一下, promise 是一个具有 3 个状态的状态机

  1. Pending 操作正在进行中。
  2. Fulfilled 操作成功完成。
  3. 已拒绝 操作遇到错误。

Settled 表示承诺要么被履行要么被拒绝,所以你可以想到 allSettled() 就像等待数组中的所有承诺都得到解决一样。

返回值

allSettled() 将包含一个对象数组,其中包含 {status: 'fulfilled', value} 如果承诺得到履行或 {status: 'rejected', reason} 如果承诺被拒绝。

// [{ status: "fulfilled", value: "Hello World" }, { status: "rejected", reason: "fail" }]
const res = await Promise.allSettled([Promise.resolve('Hello World'), Promise.reject('fail')]);

要检查是否有任何承诺被拒绝,您可以使用 Array#find() 功能

res.find(({ status }) => status === 'rejected');

浏览器支持

allSettled() Internet Explorer 和低于 12.9 的 Node.js 版本不支持。 但是,您可以使用 Promise.all() 对于不支持的环境 allSettled() 如下所示:

function allSettled(promises) {
  const _promises = promises.map(p => {
    return p.
      then(value => ({ status: 'fulfilled', value })).
      catch(reason => ({ status: 'rejected', reason });
  });
  return Promise.all(_promises);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

蘑菇王子

暂无简介

文章
评论
26 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文