🍊

Promiseの並行処理まとめ

2023/07/06に公開

4つのメソッド

Promiseには、並行処理を実現する4つのスタティックメソッドがあります。

メソッド 返り値(Promise状態) ショートサーキット
all() すべてのfulfilled 1つでもrejectedになったら
race() 1つのfulfilledまたはrejected 1つでもsettledになったら
allSettled() すべてのfulfilledrejected ショートサーキットしない
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'
}

参考文献

この記事は以下の情報を参考にして執筆しました。

https://www.oreilly.co.jp/books/9784873119236/


オプティマインドでは「多様性が進んだ世の中でも、全ての人に物が届く世界を持続可能にする」という物流業界の壮大な社会課題を解決すべく、 一緒に働く仲間を大募集中です。 少しでも興味が湧いた方は是非お気軽にカジュアル面談をお申し込みください!

https://recruit.optimind.tech/

Discussion