了解 Promise.any() 用法

共 1389字,需浏览 3分钟

 ·

2021-08-22 09:29


2021 年 6 月发布 ES2021 标准。ES2021 引入了 Promise.any() 方法。该方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例返回。


const p = Promise.any([p1, p2, p3]);


只要参数实例有一个变成 fulfilled 状态,包装实例就会变成 fulfilled 状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。


Promise.any() 跟 Promise.race() 方法很像,只有一点不同。


const p = Promise.race([p1, p2, p3]);


上面代码中,只要 p1、p2、p3 之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给 p 的回调函数。


Promise.any() 必须等到所有参数 p1、p2、p3 变成 rejected 状态才会结束。


const promises = [  fetch('/endpoint-a').then(() => 'a'),  fetch('/endpoint-b').then(() => 'b'),  fetch('/endpoint-c').then(() => 'c'),];
try { const first = await Promise.any(promises); console.log(first);} catch (error) { console.log(error);}


上面代码中,Promise.any() 方法的参数数组包含三个 Promise 操作。其中只要有一个变成fulfilled,Promise.any() 返回的 Promise 对象就变成 fulfilled。如果所有三个操作都变成rejected,那么 await 命令就会抛出错误。


Promise.any() 抛出的错误,不是一个一般的 Error 错误对象,而是一个 AggregateError 实例。它相当于一个数组,每个成员对应一个被 rejected 的操作所抛出的错误。下面是 AggregateError 的实现示例。


// new AggregateError() extends Array
const err = new AggregateError();err.push(new Error("first error"));err.push(new Error("second error"));// ...throw err;


Promise.all() 方法只适合所有异步操作都成功的情况,如果有一个操作失败,就无法满足要求。



ES2020 引入了Promise.allSettled() 方法,用来确定一组异步操作是否都结束了(不管成功或失败)。所以,它的名字叫做”Settled“,包含了”fulfilled“和”rejected“两种情况。


浏览 15
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报