💰

[JavaScript]Promiseを使った並列処理

に公開

はじめに

ここではJavaScriptにおけるPromiseについて解説します。

Promiseのステータス一覧

  • pending
    • resolve, rejectが呼び出される前の状態
  • fulfilled
    • resolveが呼び出された状態
  • rejected
    • rejectが呼び出された状態

Promise.all

すべての非同期処理を並列に実行し、すべての完了を待ってから次の処理を行います。
与えられたPromiseインスタンスがfulfilledになった際に続くthenメソッドの処理に移ります。その際にthenのコールバック関数の引数に渡されるのは各resolveに設定した実引数が格納された配列です。
一つでもrejectedになればcatchメソッドに移ります。

Promise.all(iterablePromisees)
  .then((resolveArray) =>{...})
  .catch((e) => {...});

Promise.race

最初にfulfilled、rejectedになったPromiseの結果を取得し、続くthenメソッドかcatchメソッドの処理に移ります。

Promise.race(iterablePromisees)
  .then((firstResolvedValue) =>{...})
  .catch((e) => {...});

Promise.any

最初にfulfilledになったPromiseの結果を取得し、続くthenメソッドの処理に移ります。
すべてrejectedになった場合はcatchメソッドの処理に移ります。

Promise.any(iterablePromisees)
  .then((ResolvedValue) =>{...})
  .catch((e) => {...});

Promise.allSetled

すべてのPromiseがfulfilledかrejectedになるまで待ち、それぞれのプロミスの最終的な結果を含むオブジェクトを返します。
catchメソッドは使いません。
thenメソッドのコールバック関数にそれぞれのPromiseのインスタンス状態(status)と値(valueかreason)が対で格納された配列が渡されます。
以下はarryに格納される配列の例です。

[
   { status : "fulfilled", value: "resolveの値" },
   { status : "rejected", reason: "rejectの値" }
]
Promise.allSetled(iterablePromisees)
  .then((arry) =>{...})

Discussion