了解 Promise.any() 用法

2021 年 6 月發(fā)布 ES2021 標(biāo)準(zhǔn)。ES2021 引入了 Promise.any() 方法。該方法接受一組 Promise 實(shí)例作為參數(shù),包裝成一個(gè)新的 Promise 實(shí)例返回。
const p = Promise.any([p1, p2, p3]);只要參數(shù)實(shí)例有一個(gè)變成 fulfilled 狀態(tài),包裝實(shí)例就會(huì)變成 fulfilled 狀態(tài);如果所有參數(shù)實(shí)例都變成rejected狀態(tài),包裝實(shí)例就會(huì)變成rejected狀態(tài)。
Promise.any() 跟 Promise.race() 方法很像,只有一點(diǎn)不同。
const p = Promise.race([p1, p2, p3]);上面代碼中,只要 p1、p2、p3 之中有一個(gè)實(shí)例率先改變狀態(tài),p的狀態(tài)就跟著改變。那個(gè)率先改變的 Promise 實(shí)例的返回值,就傳遞給 p 的回調(diào)函數(shù)。
Promise.any() 必須等到所有參數(shù) p1、p2、p3 變成 rejected 狀態(tài)才會(huì)結(jié)束。
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() 方法的參數(shù)數(shù)組包含三個(gè) Promise 操作。其中只要有一個(gè)變成fulfilled,Promise.any() 返回的 Promise 對(duì)象就變成 fulfilled。如果所有三個(gè)操作都變成rejected,那么 await 命令就會(huì)拋出錯(cuò)誤。
Promise.any() 拋出的錯(cuò)誤,不是一個(gè)一般的 Error 錯(cuò)誤對(duì)象,而是一個(gè) AggregateError 實(shí)例。它相當(dāng)于一個(gè)數(shù)組,每個(gè)成員對(duì)應(yīng)一個(gè)被 rejected 的操作所拋出的錯(cuò)誤。下面是 AggregateError 的實(shí)現(xiàn)示例。
// new AggregateError() extends Arrayconst err = new AggregateError();err.push(new Error("first error"));err.push(new Error("second error"));// ...throw err;
Promise.all() 方法只適合所有異步操作都成功的情況,如果有一個(gè)操作失敗,就無(wú)法滿足要求。
ES2020 引入了Promise.allSettled() 方法,用來(lái)確定一組異步操作是否都結(jié)束了(不管成功或失?。K?,它的名字叫做”Settled“,包含了”fulfilled“和”rejected“兩種情況。
