Promise.any()返回首个fulfilled Promise的结果,忽略rejected项;全部rejected时抛出AggregateError。它与Promise.race()区别在于只响应fulfill,不响应reject。

Promise.any() 返回第一个成功(fulfilled)的 Promise 结果,忽略失败(rejected)项,但所有 Promise 都失败时会抛出 AggregateError。
核心行为:只关心“首个成功”,其余失败可被忽略
Promise.any() 接收一个 Promise 实例数组,只要其中任意一个进入 fulfilled 状态,就立即以该值 resolve。其他仍在 pending 的 Promise 不会被取消,但其结果不再被关注;已 rejected 的 Promise 会被静默丢弃,不触发 catch。
例如:
Promise.any([
new Promise((_, reject) => setTimeout(() => reject('A'), 100)),
new Promise(resolve => setTimeout(() => resolve('B'), 200)),
new Promise(resolve => setTimeout(() => resolve('C'), 50))
]).then(console.log); // 输出 'C'(最快成功的那个)
全部失败时抛出 AggregateError,不是普通 Error
当传入的所有 Promise 都 rejected(或数组为空),Promise.any() 返回一个 rejected Promise,reason 是一个 AggregateError 实例,其 errors 属性包含所有原始 rejection 原因。
立即学习“Java免费学习笔记(深入)”;
使用时需注意捕获方式:
- 不能用
catch(err => err.message)直接取错误信息(因为 AggregateError.errors 是数组) - 推荐用
catch(err => console.error(err.errors))或遍历err.errors - 可用
err instanceof AggregateError做类型判断
与 Promise.race() 的关键区别
两者都“抢第一个”,但判定标准不同:
- Promise.race():谁先 settle(无论 fulfill 还是 reject),就立刻以该结果结束
- Promise.any():只认 fulfill;reject 被跳过,直到有 fulfill 出现,或全部 reject
因此,若数组中最快完成的是一个 rejected Promise,race 会立即失败,而 any 会继续等待其他 Promise。
适用场景:容错式并发请求、降级策略
常见于需要“至少一个服务可用”的场景:
- 向多个 CDN 或镜像源并发请求同一资源,取最先返回的成功响应
- 调用主 API 失败时,自动尝试备用接口(用 any 并行发起,不等主接口超时)
- 特征检测:并行检查多个浏览器 API 是否可用,取首个支持项
注意:Promise.any() 不取消已启动的异步操作,仅忽略结果。如需真正取消,需配合 AbortController 等机制。










