Promise.any S4
- 阶段: Stage 4
- 状态: 已完成
- ECMAScript 版本: ES2021
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案引入了 Promise.any,它从可迭代对象中取第一个兑现的 promise 进行兑现,如果全部拒绝则用 AggregateError 拒绝。它还添加了 AggregateError 类。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
ECMAScript 提案:Promise.any + AggregateError
作者:Mathias Bynens, Kevin Gibbons, Sergey Rubanov
** Champion **:Mathias Bynens
阶段:TC39 流程中的第 4 阶段。
动机
这些组合器在用户态的 promise 库中都很常见,且各自独立有用,分别服务于不同的用例。
提议的解决方案
Promise.any 接受一个 promise 的可迭代对象,并返回一个 promise,该 promise 由第一个被兑现的给定 promise 兑现,或者如果所有给定的 promise 都被拒绝,则用一个包含拒绝原因的 AggregateError 拒绝。(如果发生更根本的错误,例如迭代可迭代对象时抛出异常,Promise.any 会返回一个带有该异常的被拒绝的 promise。)
高级 API
或者,不使用 async/await:
在上述示例中,error 是一个 AggregateError,这是一个新的 Error 子类,用于将各个错误分组在一起。每个 AggregateError 实例都包含一个指向异常数组的指针。
常见问题解答
为什么选择 any 这个名称?
它清晰地描述了其功能,并且在提供此功能的用户态库中已有 any 名称的先例:
- https://github.com/kriskowal/q#combination
- http://bluebirdjs.com/docs/api/promise.any.html
- https://github.com/m0ppers/promise-any
- https://github.com/cujojs/when/blob/master/docs/api.md#whenany
- https://github.com/sindresorhus/p-any
为什么抛出 AggregateError 而不是数组?
ECMAScript 语言中的主流实践是只抛出异常类型。生态系统中的现有代码很可能依赖于这样一个事实:目前,内置方法和语法抛出的所有异常都是 instanceof Error。增加一个可能抛出普通数组的新语言特性会打破这一不变量,并可能导致 Web 兼容性问题。此外,通过使用 Error 实例(或子类),可以提供堆栈跟踪——如果不需要,可以很容易地丢弃,但如果需要,以后无法再获得。
示例
以下代码片段检查哪个端点响应最快,然后将其记录下来。
TC39 会议记录
- 2019 年 3 月
- 2019 年 6 月
- 2019 年 7 月
- 2019 年 10 月 第一部分 和 第二部分
- 2020 年 6 月 第一部分 和 第二部分
- 2020 年 7 月
规范
实现
-
JavaScript 引擎:
- JavaScriptCore,在 Safari 14 中发布
- SpiderMonkey,在 Firefox 79 中发布
- V8,在 Chrome 85 中发布
- XS
- engine262
-
Polyfill: