Promise.all()
處理 Promise Array 時,必須所有的 Promise 為 Fulfilled 才行,只要有一個 Promise 為 Rejected 就會失敗,若想有幾個 Fulfilled 就顯示幾個,而放棄 Rejected,就得使用 Promise.allSettled()
。
Version
macOS Catalina 10.15.4
WebStorm 2019.3.4
Node 12.4.0
ECMAScript 2020
Promise.all()
let data = [
Promise.resolve(1),
Promise.reject(2),
Promise.resolve(3)
]
Promise.all(data)
.then(console.log)
.catch(console.log)
第 1 行
let data = [
Promise.resolve(1),
Promise.reject(2),
Promise.resolve(3)
]
Promise array 中並非所有 promise 都 resolve,其中 data[1]
為 rejected promise。
第 7 行
Promise.all(data)
.then(log)
.catch(log)
若使用 Promise.all()
只會得到 rejected promise。
Promise.allSettled()
let data = [
Promise.resolve(1),
Promise.reject(2),
Promise.resolve(3)
]
Promise.allSettled(data)
.then(x => x.filter(x => x.status === 'fulfilled'))
.then(x => x.map(x => x.value))
.then(console.log)
.catch(console.log)
無論是 fulfilled 或 rejected,凡不是 pending 都統稱為 settled,若我們想得到所有 fulfilled promise,可使用 filter()
將 fulfilled
status 濾出,再使用 map()
取出 value
property。
Conclusion
Promise.allSettled()
定義在 ECMAScript 2020,為較新的 function,目前在 Quokka 還無法使用,但在 Node + Babel 與 Vue + Babel 可正常運作