ES2015で導入されてるPromiseコンビネータはPromise.all
とPromise.race
だが、現在Promise.allSettled
とPromise.any
が提案されている模様。
Promise.allSettled
はStage3で、Google Chrome 76以降で試せる。Promise.any
はまだStage1。
Promise.allSettled
Promise.allSettled
メソッドは引数に渡されたすべてのPromiseについての結果を、それぞれすべてが完了したあとで、結果が記述されたオブジェクトの配列とともに返す。
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one')
})
const promise2 = new Promise((resolve, reject) => {
setTimeout(reject, 100, 'Intentional error');
})
const results = Promise.allSettled([promise1, promise2]).then((value) => {
console.log(value)
})
// [
// {"status":"fulfilled","value":"one"},
// {"status":"rejected","reason":"Intentional error"}
// ]
Promise.any
Promise.any
はいずれかのPromise
がresolve
されるとすぐに戻り値を返す。Promise.race
と挙動は似ているが、Promise.race
はいちばんはじめに解決したPromise(resolve
でも reject
でも)を返却するのに対し、any
はreject
のときは返さない。
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one')
})
const promise2 = new Promise((resolve, reject) => {
setTimeout(reject, 100, 'two');
})
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'three');
})
const results = Promise.any([promise1, promise2, promise3]).then((value) => {
// いちばん最初にfulfilledになったPromiseが返される
}).error(() => {
// すべてのPromiseが失敗した際に実行される
})