Promise.allSettled()

Baseline 已廣泛支援

此特性已經十分成熟,可在許多裝置和瀏覽器版本上使用。自 2020 年 7 月以來,它已在各大瀏覽器中可用。

Promise.allSettled() 靜態方法接受一個 Promise 可迭代物件作為輸入,並返回一個單獨的 Promise。這個返回的 Promise 在所有輸入的 Promises 都“settle”(即完成或拒絕)時 fulfilled(無論輸入的可迭代物件是否為空)。它 fulfilled 的值為一個物件陣列,每個物件描述了每個 Promise 的結果。

試一試

const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) =>
  setTimeout(reject, 100, "foo"),
);
const promises = [promise1, promise2];

Promise.allSettled(promises).then((results) =>
  results.forEach((result) => console.log(result.status)),
);

// Expected output:
// "fulfilled"
// "rejected"

語法

js
Promise.allSettled(iterable)

引數

iterable

一個 promise 的 可迭代物件(例如 Array)。

返回值

一個 Promise,它

  • 如果傳入的可迭代物件為空,則 **立即 fulfilled**。

  • 當給定 iterable 中的所有 Promises 都已 settle(fulfilled 或 rejected)時,**非同步 fulfilled**。fulfilled 的值為一個物件陣列,每個物件描述了 iterable 中一個 Promise 的結果,順序與傳入的 Promise 順序一致,不考慮完成順序。每個結果物件具有以下屬性:

    status

    一個字串,可能是 "fulfilled""rejected",表示 Promise 的最終狀態。

    value

    只有當 status"fulfilled" 時才存在。Promise fulfilled 的值。

    reason

    只有當 status"rejected" 時才存在。Promise 被 rejected 的原因。

    如果傳入的可迭代物件非空但其中不包含任何待定(pending)的 Promise,則返回的 Promise 仍然是非同步 fulfilled(而不是同步)。

描述

Promise.allSettled() 方法是 Promise 併發 方法之一。當你有多個非同步任務,它們之間不相互依賴,或者你總是想知道每個 Promise 的結果時,通常會使用 Promise.allSettled()

相比之下,如果任務相互依賴,或者你希望在任何一個任務 rejected 時立即 rejection,那麼由 Promise.all() 返回的 Promise 可能更適合。

示例

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

規範

規範
ECMAScript® 2026 語言規範
# sec-promise.allsettled

瀏覽器相容性

另見