promise.race返回最先settled的promise结果,无论fulfilled或rejected;它接收promise数组,适用于超时控制、多源选最快等场景,需注意reject会立即终止并抛出错误。

Promise.race 会监听一组 Promise,一旦其中任意一个完成(fulfilled 或 rejected),就立即返回那个结果,不再等待其余 Promise。
基本用法:传入 Promise 数组
它接收一个可迭代对象(通常是数组),里面包含多个 Promise 实例:
const p1 = new Promise(resolve => setTimeout(() => resolve('快的'), 100));
const p2 = new Promise(resolve => setTimeout(() => resolve('慢的'), 500));
Promise.race([p1, p2])
.then(result => console.log(result)) // 输出:'快的'
.catch(err => console.error(err));
注意:失败也会“胜出”
如果最先结束的是被 reject 的 Promise,Promise.race 就会直接 reject,不会等其他成功的结果:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
const p1 = new Promise((_, reject) => setTimeout(() => reject('炸了'), 50));
const p2 = new Promise(resolve => setTimeout(() => resolve('其实我好了'), 200));
Promise.race([p1, p2])
.then(console.log) // 不会执行
.catch(err => console.log(err)); // 输出:'炸了'
实用场景举例
- 超时控制:给异步操作加时限,避免无限等待
- 多源请求选最快:比如同时调用多个 CDN 或镜像接口,取响应最快的
- 竞态取消:配合 AbortController 或封装 cancelable Promise 可实现“谁先到谁生效”逻辑
小技巧:避免因失败中断整体流程
若希望“只取第一个成功的”,可先将每个 Promise 包装成必定 resolve 的形式(例如用 .catch(() => undefined)):
const safeRace = promises =>
Promise.race(
promises.map(p => p.catch(err => ({ error: true, value: err })))
);
safeRace([p1, p2])
.then(result => {
if (result?.error) {
console.log('这个失败了,继续等别的?');
} else {
console.log('拿到结果:', result);
}
});
不复杂但容易忽略:Promise.race 关注的是“最先 settle”,不是“最先 fulfilled”。设计时务必考虑 reject 的影响。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










