promise.any 返回第一个成功 promise 的结果,全部失败时以 aggregateerror 拒绝;它忽略失败项、不中断执行,但不自动取消未完成的 promise。

Promise.any 会等待所有 Promise 中第一个成功(fulfilled)的结果,并立即返回该结果;只要有一个成功,就立刻 resolve,忽略其余仍在进行或失败的 Promise。
核心行为:只关心“最快的成功”,不等失败
与 Promise.race 不同,Promise.any 不会在第一个 rejection 时 reject,而是跳过失败项,继续等待其他 Promise 成功。只有当所有 Promise 都 rejected 时,它才会以 AggregateError reject。
- ✅ 任意一个 Promise 成功 → 立即 resolve 对应值
- ❌ 全部 Promise 失败 → reject 一个包含所有错误的
AggregateError - ⚠️ 某个 Promise 失败,但其他还在 pending 或将成功 → 它会被忽略,不中断流程
基本用法示例
假设发起三个网络请求,想拿到最先响应成功的数据:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
const fast = fetch('/api/data?delay=100').then(r => r.json());
const slow = fetch('/api/data?delay=2000').then(r => r.json());
const fail = Promise.reject(new Error('Network timeout'));
Promise.any([fast, slow, fail])
.then(result => console.log('最快成功结果:', result)) // 输出 fast 的响应
.catch(err => console.error('全部失败:', err)); // 只有全失败才进这里
注意:失败的 Promise 不会阻塞,但需确保它们可被清理
Promise.any 不会取消仍在运行的 Promise(比如未终止的 fetch 请求)。如果业务需要资源控制,得手动 Abort:
- 使用
AbortController配合 fetch,即使 Promise.any 已 resolve,也要调用abort()防止后台请求持续 - 避免内存泄漏或多余副作用(如重复提交、未释放定时器)
兼容性与降级建议
Promise.any 是 ES2021(ES12)特性,现代浏览器和 Node.js 16+ 原生支持。若需兼容旧环境:
- 用 es-shim/Promise.any 等 polyfill
- 手动实现简易版(仅用于学习):
用Promise.allSettled+ 过滤 fulfilled 结果 + 找第一个,但无法真正“中断”其他 Promise
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










