簡(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 的返回值。
allSettled
和 all
有一些區(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ò)誤妓羊。
any
與 all
是相對(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" }
本文使用 文章同步助手 同步