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

浏览器兼容性

另见