🍊
Promiseの並行処理まとめ
4つのメソッド
Promiseには、並行処理を実現する4つのスタティックメソッドがあります。
メソッド | 返り値(Promise状態) | ショートサーキット |
---|---|---|
all() |
すべてのfulfilled
|
1つでもrejected になったら |
race() |
1つのfulfilled またはrejected
|
1つでもsettled になったら |
allSettled() |
すべてのfulfilled とrejected
|
ショートサーキットしない |
any() |
1つのfulfilled
|
1つでもfulfilled になったら |
ショートサーキット
ショートサーキットとは、引数に渡したすべてのPromiseインスタンスがsettled
になるのを待たずに、返り値のPromiseインスタンスがsettled
になることを指します。
Promise.all()
すべてがfulfilled
になったら、引数で与えられた順番通りにPromiseの配列を返します。
1つでもrejected
になったら、そのPromiseを1つだけ返します。
const concurrentAsyncFunc = async () => {
const result = await Promise.all([
Promise.resolve('Hello'),
Promise.resolve('World'),
]);
console.log(result); // ['Hello', 'World']
}
Promise.race()
どれか1つでもsettled
になったら、そのPromiseを1つだけ返します。
const concurrentAsyncFunc = async () => {
const result = await Promise.race([
Promise.resolve('Hello'),
Promise.resolve('World'),
]);
console.log(result); // 'Hello'
}
ハンズオンNode.jsで書かれている以下の内容が理解に役立ちます。
Promise.race()
はその名前から仕様を予測するのが難しいことに気がつくでしょう。これは歴史的経緯によるものですが、Promise.race()
は本当はPromise.anySettled()
のような名前が望ましかったことを覚えておくと、仕様を思い出しやすくなるかもしれません。
Promise.allSettled()
すべてがsettled
になったら、status, value(rejected
の場合はreason)のプロパティを持つオブジェクトのPromiseの配列を返します。
const concurrentAsyncFunc = async () => {
const result = await Promise.allSettled([
Promise.resolve('Hello'),
Promise.reject(new Error('エラー')),
]);
console.log(result);
// [
// { status: 'fulfilled', value: 'Hello' },
// { status: 'rejected', reason: Error: エラー ... (省略) }
// ]
}
Promise.any()
どれか1つでもfulfilled
になったら、そのPromiseを1つだけ返します。
すべてがrejected
になったら、引数で与えられた順番通りにエラーの配列を返します。
const concurrentAsyncFunc = async () => {
const result = await Promise.any([
Promise.resolve('Hello'),
Promise.reject(new Error('エラー')),
]);
console.log(result); // 'Hello'
}
参考文献
この記事は以下の情報を参考にして執筆しました。
オプティマインドでは「多様性が進んだ世の中でも、全ての人に物が届く世界を持続可能にする」という物流業界の壮大な社会課題を解決すべく、 一緒に働く仲間を大募集中です。 少しでも興味が湧いた方は是非お気軽にカジュアル面談をお申し込みください!
Discussion