Promise.allSettled()

Promise.allSettled() メソッドは、与えられたすべてのプロミスが履行されたか拒否された後に、それぞれのプロミスの結果を記述した配列オブジェクトで解決されるプロミスを返します。

一般的には、複数の非同期タスクがあり、お互いに依存せずに正常に完了する場合や、各プロミスの結果を常に知りたい場合に使用されます。

これに対して、 Promise.all() で返されるプロミスは、タスクがお互いに依存している場合や、タスクのいずれかが拒否されたときにすぐに拒否したい場合にはより適切かもしれません。

構文

Promise.allSettled(iterable);

引数

iterable

Array などの反復可能オブジェクトで、それぞれの要素が Promise であるものです。

返値

待ち状態Promise で、指定されたプロミスの集合に含まれるすべてのプロミスが、正常に履行されるか拒否されるかのどちらかで完了すると、非同期に解決されます。その際、返されたプロミスのハンドラーには、元のプロミスの集合に含まれるの各プロミスの結果を含む配列が入力として渡されます。

ただし、空の反復可能オブジェクトが引数として渡された場合に限りPromise.allSettled() は空の配列として解決済みの Promise オブジェクトを返します。

出力されるそれぞれのオブジェクトには、 status の文字列が存在します。 status が fulfilled (履行) であれば、 value が存在します。 status が rejected (拒否) であれば、 reason が存在します。 value (または reason) はそれぞれのプロミスがどの値で履行 (または拒否) されたかを反映します。

Promise.allSettled の使用

Promise.prototype.then()

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}
// ]

await

const values = await Promise.allSettled([
  Promise.resolve(33),
  new Promise(resolve => setTimeout(() => resolve(66), 0)),
  99,
  Promise.reject(new Error('an error'))
])
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 (ECMAScript)
# sec-promise.allsettled

ブラウザーの互換性

BCD tables only load in the browser

関連情報