Promise.race返回最先settled的Promise结果,无论fulfilled或rejected;若需最快成功值,应包装Promise将失败转为默认值;常用于超时控制,但不取消其余Promise。

Promise.race 会监听传入的多个 Promise,一旦其中任意一个完成(fulfilled 或 rejected),就立即以该 Promise 的结果(值或错误)作为整个 race 的结果,不再等待其余 Promise。
核心行为:谁先“定论”,谁就胜出
它不关心哪个 Promise 最快 成功,而是看哪个最先 结束——不管是成功还是失败。
- 如果第一个 settled 的是 fulfilled,
Promise.race返回 fulfilled 状态,值为该 Promise 的 resolve 值; - 如果第一个 settled 的是 rejected,
Promise.race立即 reject,错误为该 Promise 的 reject 原因。
获取最快成功的值(排除失败干扰)
若你只想要“最快返回的成功结果”,需避免被率先失败的 Promise 中断。常见做法是用 .catch(() => undefined) 把失败转为成功(返回 undefined 或默认值),再配合过滤:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
const promises = [
fetch('/api/fast').then(r => r.json()),
fetch('/api/slow').then(r => r.json()),
new Promise(r => setTimeout(() => r('fallback'), 3000))
];
// 包装每个 Promise,失败时返回特殊标记(如 null)
const safePromises = promises.map(p =>
p.catch(() => null)
);
Promise.race(safePromises)
.then(result => {
if (result === null) {
console.log('所有都失败了或超时');
} else {
console.log('最快的成功结果:', result);
}
});
配合超时控制(最常用场景)
常用于给请求加超时限制,确保不会无限等待:
立即学习“Java免费学习笔记(深入)”;
- 构造一个在指定时间后 reject 的 timeout Promise;
- 与业务 Promise 一起传入
race; - 若超时先触发,则整体 reject,可捕获并处理超时逻辑。
function timeout(ms, promise) {
return Promise.race([
promise,
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Timeout')), ms)
)
]);
}
timeout(2000, fetch('/api/data'))
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error('请求失败或超时:', err.message));
注意:race 不取消其他 Promise
Promise.race 只是“监听+响应”,它 不会中断、取消或清理其余仍在运行的 Promise。比如一个网络请求已发出,即使 race 已返回,该请求仍可能在后台继续执行并占用资源。如需真正取消,请使用 AbortController 配合 fetch 等原生支持取消的 API。

















