LoginSignup
3
0

More than 3 years have passed since last update.

Promiseコンビネータに提案されてる2つのメソッド

Last updated at Posted at 2019-06-13

ES2015で導入されてるPromiseコンビネータはPromise.allPromise.raceだが、現在Promise.allSettledPromise.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はいずれかのPromiseresolveされるとすぐに戻り値を返す。Promise.raceと挙動は似ているが、Promise.raceはいちばんはじめに解決したPromise(resolveでも rejectでも)を返却するのに対し、anyrejectのときは返さない。

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が失敗した際に実行される
})

参考リンク

3
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0