promise.race返回第一个settled的promise结果(无论fulfilled或rejected),用于超时控制、竞速请求等场景;其余promise继续执行但不改变结果。

Promise.race 会监听一组 Promise,一旦其中**任意一个**完成(fulfilled 或 rejected),就立即以它的结果(值或错误)作为整个 race 的结果,其余未完成的 Promise 不再影响返回值——但它们仍会继续执行(不会自动取消)。
基本用法:拿到第一个“跑完”的结果
适用于需要“最快响应”的场景,比如多接口冗余请求、设置超时、竞态控制等。
- 传入一个 Promise 数组,返回一个新的 Promise
- 只要有一个 Promise 变成 fulfilled,race 就以该值 resolve
- 只要有一个 Promise 变成 rejected,race 就以该错误 reject(即使其他是成功的)
常见示例:带超时的请求
用 Promise.race 包裹真实请求 + 一个定时 reject 的 Promise,就能实现“超时即失败”:
function fetchWithTimeout(url, timeout = 5000) {
const controller = new AbortController();
const timeoutPromise = new Promise((_, reject) => {
setTimeout(() => reject(new Error('请求超时')), timeout);
});
const fetchPromise = fetch(url, { signal: controller.signal });
return Promise.race([fetchPromise, timeoutPromise]);
}
// 使用
fetchWithTimeout('/api/data')
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error('失败了:', err.message));
注意:rejected 也会“胜出”,需谨慎处理错误源
如果数组中某个 Promise 立即 reject(比如参数错误),race 会立刻 reject,哪怕其他 Promise 还在正常进行。所以要确保所有参与 race 的 Promise 至少是“可控失败”的:
- 避免直接传入可能同步 throw 的函数(应包装成 Promise)
- 必要时用
.catch(() => ...)把某些错误转为成功值,防止意外中断 - 例如:想“取最快的成功结果”,可把每个请求包装成“失败也 resolve null”的形式,再 race
和 Promise.all / Promise.any 的关键区别
对比记忆更清晰:
- Promise.race:谁先定论(无论成功失败),谁说了算
- Promise.all:全部成功才成功,任一失败就失败
- Promise.any:只要一个成功就成功,全部失败才失败(ES2021+)











