promise.any 与 promise.race 的核心区别在于:promise.any 只等待第一个 fulfilled 的 promise 并返回其值,其余 rejected 被忽略;而 promise.race 响应第一个 settled(fulfilled 或 rejected)的 promise,无论成败。
promise.any 会等待所有 promise 中第一个成功完成的,然后立即返回它的结果;只要有一个 fulfilled,就立刻 resolve,其余无论成功或失败都不影响返回值。
它和 Promise.race 的区别在哪?
两者都关注“第一个完成”,但行为不同:
- Promise.race:谁先完成(fulfilled 或 rejected)就用谁——哪怕第一个是 reject,也会直接 reject 整个 race
- Promise.any:只等第一个 fulfilled;如果全是 rejected,才以 AggregateError 拒绝
基本用法示例
假设你同时发起三个 API 请求,只想取最快返回的有效数据:
从 AI 编程会话日志(Clawdbot、Claude Code、Codex)中提取对话记录。该功能用于在用户要求导出提示词历史、会话日志或 `.jsonl` 格式的会话文件时使用。
const p1 = fetch('/api/slow').then(r => r.json());
const p2 = fetch('/api/fast').then(r => r.json());
const p3 = fetch('/api/timeout').then(r => r.json());
Promise.any([p1, p2, p3])
.then(result => console.log('第一个成功的响应:', result))
.catch(err => {
if (err instanceof AggregateError) {
console.error('全部失败了', err.errors);
}
});
注意被忽略的失败情况
Promise.any 不会因为某个 Promise 失败而中断或报错——它自动跳过 rejected 的 Promise,继续等其他 fulfilled 的。只有当数组中所有 Promise 都 rejected 时,才会触发 catch 中的 AggregateError。
- 如果其中某个 Promise 永远不结束(比如 pending 状态卡住),它不会阻塞 Promise.any,只要别的 Promise 先 fulfilled 就行
- 被 rejected 的 Promise 错误默认被静默吞掉,如需监控,建议单独加 .catch() 或用工具封装
兼容性与降级方案
Promise.any 是 ES2021 新增特性,旧环境(如 IE、Node.js
- 用 Promise.allSettled + find:等待全部结束,再找第一个 fulfilled 结果(但失去“首个完成即返回”的优势)
- 手写 race-like 逻辑:用 Promise.race 包装每个 Promise,捕获 reject 并转为特殊标记,再过滤出第一个非错误结果
- 推荐直接引入 core-js 或使用 es6-promise 的 polyfill










