js Promise.race
时间: 2025-07-01 07:55:22 浏览: 11
`Promise.race()` 是 JavaScript 中 `Promise` 构造函数的一个静态方法,用于处理多个 Promise。它接收一个 Promise 可迭代对象(如数组),并返回一个新的 Promise。一旦其中任意一个 Promise **被解决**(resolve)或**被拒绝**(reject),该新 Promise 就会立即以相同的结果或原因进行 resolve 或 reject。
换句话说,`Promise.race()` 会“赛跑”:哪个 Promise 最快完成(无论是成功还是失败),就以它的结果为准。
---
### 示例代码:
```javascript
const p1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'P1 成功');
});
const p2 = new Promise((resolve, reject) => {
setTimeout(reject, 300, 'P2 失败');
});
const p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, 'P3 成功');
});
Promise.race([p1, p2, p3])
.then(value => {
console.log('成功:', value);
})
.catch(error => {
console.error('失败:', error);
});
```
---
### 解释:
- `p1` 在 500ms 后 resolved。
- `p2` 在 300ms 后 rejected。
- `p3` 在 1000ms 后 resolved。
- 因为 `p2` 是最快结束的 Promise,并且它是 rejected 的,所以整个 `Promise.race([...])` 立即进入 `.catch()` 分支,输出:
```
失败: P2 失败
```
---
### 使用场景:
1. **设置超时机制**:如果你希望某个异步操作在一定时间内完成,否则就视为失败,可以使用 `Promise.race()` 配合一个定时器 Promise。
```javascript
function timeout(ms) {
return new Promise((_, reject) => {
setTimeout(() => reject('请求超时'), ms);
});
}
fetchSomeData()
.race(timeout(5000))
.then(data => console.log('获取数据成功:', data))
.catch(err => console.error('出错:', err));
```
2. **多来源取最快结果**:比如从多个 API 获取相同数据,选择响应最快的那一个。
---
### 注意事项:
- 如果传入的 Promise 数组中有一个立即 resolve 或 reject 的 Promise,则 `race` 会立即返回。
- 如果数组为空,`Promise.race([])` 会永远处于 pending 状态。
---
阅读全文
相关推荐




















