36 – 新的 Promise 方法:allSettled & any & race

簡(jiǎn)介

在之前的兩篇文章中,我們已經(jīng)覆蓋了基礎(chǔ)和高級(jí)的 promise 知識(shí)。還有兩個(gè)不錯(cuò)的新操作符/方法葛菇,可以是代碼更簡(jiǎn)潔从媚,讓我們一起來(lái)重溫下它們逞泄。

allSettled

ES2020 或 ES11 引入了 promise.allSettled,所以它是很新的方法所以使用的時(shí)候需要當(dāng)心拜效。使用之前需要確定你要支持的瀏覽器版本喷众。

當(dāng)所有的 promise 返回不管是成功還是失敗,allSettled 都會(huì)返回一個(gè) promise紧憾。返回值是一個(gè)對(duì)象數(shù)組到千,其中每一項(xiàng)描述了輸入 promise 的返回值。

allSettledall 有一些區(qū)別赴穗。

all 會(huì)返回輸入的 promise 中第一個(gè)是失敗的結(jié)果憔四,所以如果我們輸入了 5 個(gè) promise 其中兩個(gè)失敗了,all 會(huì)返回第一個(gè)失敗的結(jié)果般眉。

allSettled 則會(huì)等待所有的 promise 完成然后返回所有按輸入順序?qū)?yīng)的結(jié)果了赵。當(dāng)異步的任務(wù)彼此沒(méi)有依賴關(guān)系使用 allSettled 然后重試失敗的任務(wù)。若你的執(zhí)行步驟依賴所有的異步任務(wù)則使用 all甸赃。

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);});

上面四個(gè)任務(wù)一旦都結(jié)束(成功或失斒裂础),allSettled 則會(huì)向 then 的回調(diào)函數(shù)中傳遞結(jié)果辑奈,打印如下:

[{  status: "fulfilled",  value: "Parwinder"}, {  status: "fulfilled",  value: "Lauren"}, {  reason: "Robert",  status: "rejected"}, {  status: "fulfilled",  value: "Eliu"}]

any

any 的輸入?yún)?shù)一般是可迭代對(duì)象比如數(shù)組苛茂,它返回?cái)?shù)組中第一個(gè)成功 promise 的結(jié)果,若所有的 promise 都失敗則返回 AggregateError 鸠窗,AggregateError 是用來(lái)組合輸入 promise 返回的獨(dú)立錯(cuò)誤妓羊。

anyall 是相對(duì)的。

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)});

假設(shè)所有的 promise 都返回錯(cuò)誤:

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"});

race

race 會(huì)返回第一個(gè)成功或失敗 promise 的結(jié)果稍计。

const promise1 = new Promise((resolve, reject) => {  setTimeout(resolve, 500, 'one');});const promise2 = new Promise((resolve, reject) => {  setTimeout(resolve, 100, 'two');});Promise.race([promise1, promise2]).then((value) => {  console.log(value);  // Both resolve, but promise2 is faster});// expected output: "two"

若傳遞給 race 的參數(shù)為空數(shù)組躁绸,則永遠(yuǎn)不會(huì)有結(jié)果:

var foreverPendingPromise = Promise.race([]);console.log(foreverPendingPromise);setTimeout(function(){    console.log('the stack is now empty');    console.log(foreverPendingPromise);});// logs, in order:// Promise { <state>: "pending" }// the stack is now empty// Promise { <state>: "pending" }

本文使用 文章同步助手 同步

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子净刮,更是在濱河造成了極大的恐慌剥哑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淹父,死亡現(xiàn)場(chǎng)離奇詭異株婴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)暑认,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)困介,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蘸际,你說(shuō)我怎么就攤上這事座哩。” “怎么了粮彤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵根穷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我导坟,道長(zhǎng)屿良,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任乍迄,我火速辦了婚禮管引,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闯两。我一直安慰自己褥伴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布漾狼。 她就那樣靜靜地躺著重慢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逊躁。 梳的紋絲不亂的頭發(fā)上似踱,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音稽煤,去河邊找鬼核芽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛酵熙,可吹牛的內(nèi)容都是我干的轧简。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼匾二,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哮独!你這毒婦竟也來(lái)了拳芙?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤皮璧,失蹤者是張志新(化名)和其女友劉穎舟扎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體悴务,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡睹限,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讯檐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邦泄。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖裂垦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肌索,我是刑警寧澤蕉拢,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站诚亚,受9級(jí)特大地震影響晕换,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜站宗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一闸准、第九天 我趴在偏房一處隱蔽的房頂上張望邑遏。 院中可真熱鬧捻撑,春花似錦、人聲如沸帝美。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至钥顽,卻和暖如春义屏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜂大。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工闽铐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奶浦。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓兄墅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親财喳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子察迟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容