前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >36 - 新的 Promise 方法:allSettled & any​

36 - 新的 Promise 方法:allSettled & any​

作者头像
前端黑板报
发布2022-12-01 17:05:25
3340
发布2022-12-01 17:05:25
举报
文章被收录于专栏:前端黑板报前端黑板报

原文地址:https://dev.to/bhagatparwinder/new-promise-methods-allsettled-any-3ii9

简介

在之前的两篇文章中,我们已经覆盖了基础和高级的 promise 知识。还有两个不错的新操作符/方法,可以是代码更简洁,让我们一起来重温下它们。

allSettled

ES2020/ES11 引入了 Promise.allSettled,它确实很新同时使用的时候也需要当心。确定一下你打算支持的浏览器是否支持该特性。

当所有的 promises 结束(成功或失败)时,allSettled 就会返回一个 promise。返回的结果是对象组成数组,并且其中每个对象描述了输入 promise 的输出结果。

Promise.allSettledPromise.all 有一些区别。

当输入其中的 promise 有失败时 Promise.all 会返回其中第一个失败的 promise 或全部成功则返回成功。所以如果我们向 promise.all 输入了 5 个 promise 而其中两个失败,promise.all 会返回第一个失败的结果。

另一方面, promise.allSettled 会等到所有的 promise 完成并返回所有输入 promise 返回的结果。当异步的 promise 之间不互相依赖可以使用 promise.allSettled,同时你可以重试失败的 promise。如果你的过程依赖所有的异步任务都成功才能继续,则使用 promise.all

代码语言:javascript
复制
const promise1 = Promise.resolve("Parwinder");
const promise2 = new Promise((resolve) => {
    setTimeout(() => {
        resolve("Lauren");
    }, 2000);
});
const promise3 = Promise.reject("Robert");
const promise4 = Promise.resolve("Eliu");

Promise.allSettled([promise1, promise2, promise3, promise4]).then((data) => {
    console.log(data);
});

一旦四个 promise 结束,allSettled 将会返回结果到 then 的回调函数中,将会输出如下:

代码语言:javascript
复制
[{
  status: "fulfilled",
  value: "Parwinder"
}, {
  status: "fulfilled",
  value: "Lauren"
}, {
  reason: "Robert",
  status: "rejected"
}, {
  status: "fulfilled",
  value: "Eliu"
}]

Any

Promise.any 在提案的第三个阶段(作者写文时是天状态,现在已经通过)。

Promise.any 可以接受一列可迭代的 promise,同时返回第一个成功的 promise。如果没有一个 promise 成功,则返回 AggregateErrorAggregateError 会聚合所有输入的 promise 返回的错误。

Promise.anyPromise.all 完全相反。

代码语言:javascript
复制
const promise1 = Promise.resolve("Parwinder");
const promise2 = new Promise((resolve) => {
    setTimeout(() => {
        resolve("Lauren");
    }, 2000);
});
const promise3 = Promise.reject("Robert");
const promise4 = Promise.resolve("Eliu");

Promise.any([promise1, promise2, promise3, promise4]).then((data) => {
    console.log(data); // Parwinder (first successful promise)
});

全部错误的 promise 例子:

代码语言:javascript
复制
const promise1 = Promise.reject("Parwinder");
const promise2 = new Promise((resolve,reject) => {
    setTimeout(() => {
        reject("Lauren");
    }, 2000);
});
const promise3 = Promise.reject("Robert");
const promise4 = Promise.reject("Eliu");

Promise.any([promise1, promise2, promise3, promise4]).then((data) => {
    console.log(data); // "AggregateError: No Promise in Promise.any was resolved"
});
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端黑板报 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • allSettled
  • Any
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档