Promise.allSettled()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2020.

Promise.allSettled() は静的メソッドで、入力としてプロミスの反復可能オブジェクトを受け取り、単一の Promise を返します。この返されたプロミスは、入力のすべてのプロミスが決定したとき(空の反復可能オブジェクトが渡された場合を含む)に履行され、各プロミスの結果を記述するオブジェクトの配列が返されます。

試してみましょう

構文

js
Promise.allSettled(iterable)

引数

iterable

プロミスの反復可能オブジェクトArray など)です。

返値

次のような Promise です。

  • 反復可能オブジェクトが空であった場合は、履行済みになります。
  • 渡された反復可能オブジェクトのすべてのプロミスが(履行または拒否に)決定したとき、非同期に履行されます。履行されたプロミスの値はオブジェクトの配列で、それぞれが反復可能なオブジェクトの中の一つのプロミスの結果を記述しています。それぞれの成果オブジェクトには、以下のようなプロパティがあります。
    status

    文字列で、 "fulfilled" (履行)または "rejected" (拒否)をとり、そのプロミスの最終的な状態を示します。

    value

    status"fulfilled" の場合のみ存在します。プロミスが履行された値です。

    reason

    status"rejected" の場合のみ存在します。プロミスが拒否された理由です。

渡された反復可能オブジェクトが空でなく、待機中のプロミスを含んでいない場合、返されたプロミスは(同期ではなく)非同期に履行されます。

解説

Promise.allSettled() メソッドはプロミスの並行処理 メソッドの 1 つです。Promise.allSettled() は、通常、正常に完了するために互いに依存しない複数の非同期タスクがある場合、または各プロミスの結果を常に知りたい場合に使用されます。

メモ: 日本語の技術文書では、このメソッドが複数のプロミスを並列に処理すると説明されることがありますが、実際には複数のスレッドでプロミスが処理されるわけではないことに注意してください。詳細はプロミスの並行処理を参照してください。

それに対して、 Promise.all() が返すプロミスは、タスクが他にも依存している場合や、どれかが拒否されたらすぐに拒否したい場合により適しているかもしれません。

Promise.allSettled の使用

js
Promise.allSettled([
  Promise.resolve(33),
  new Promise((resolve) => setTimeout(() => resolve(66), 0)),
  99,
  Promise.reject(new Error("an error")),
]).then((values) => console.log(values));

// [
//   { status: 'fulfilled', value: 33 },
//   { status: 'fulfilled', value: 66 },
//   { status: 'fulfilled', value: 99 },
//   { status: 'rejected', reason: Error: an error }
// ]

仕様書

Specification
ECMAScript Language Specification
# sec-promise.allsettled

ブラウザーの互換性

BCD tables only load in the browser

関連情報