promise.race立即返回数组中第一个已settled的promise,无论fulfilled或rejected;若存在已fulfilled或已rejected的promise,则同步返回该promise,不等待其他promise。

Promise.race 会立即返回第一个“settled”(已决议)的 Promise,无论它是已 fulfilled 还是已 rejected —— 关键不在于“谁先被创建”,而在于“谁最先进入 settled 状态”。
已存在的 fulfilled Promise 会立刻胜出
如果传入 Promise.race 的数组中,有一个 Promise 已经是 fulfilled(比如通过 Promise.resolve(42) 创建),那么 race 会**同步返回这个已决议的 Promise**,后续其他 Promise 即使更快 resolve 或 reject,也完全不会影响结果。
例如:
const fast = Promise.resolve('immediate');
const slow = new Promise(resolve => setTimeout(() => resolve('delayed'), 100));
Promise.race([fast, slow])
.then(console.log); // 立即输出 'immediate'
注意:不是“最快创建”,而是“最早 settled”
即使一个 Promise 对象在数组中排第二,只要它已经 settled,而第一个仍是 pending,race 仍会选它。因为 race 内部遍历数组时,对每个 Promise 调用 Promise.resolve(p),而对已 fulfilled 的 Promise,该操作直接返回原 Promise,并触发微任务队列中的 then 回调。
这意味着:
- 已 fulfilled 的 Promise 不需要等待事件循环;它的状态可被立即读取
- race 不会“等待”任何 pending Promise,只要遇到一个 settled 就立刻决议自身
- 多个已 fulfilled 的 Promise 同时存在?race 返回数组中索引最小的那个已 settled 的 Promise(因为遍历顺序是确定的)
rejected Promise 同样适用此规则
如果数组里有已 rejected 的 Promise(如 Promise.reject(new Error('boom'))),且它出现在第一个已 settled 的位置,race 会立即以该 rejection 拒绝,不会等其他 Promise。
例如:
const bad = Promise.reject('oops');
const good = Promise.resolve('ok');
Promise.race([bad, good])
.catch(console.error); // 立即输出 'oops'
常见误区:和 Promise.all 的行为对比
Promise.all 必须等待所有 Promise 都 fulfilled 才成功;而 race 只看“第一个 settled”,不管 fulfilled 还是 rejected,也不管它是不是“新创建”的。所以不要误以为 race 总是挑“最快执行完”的——它挑的是“当前已知最先完成的”,哪怕那个完成发生在调用 race 之前。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











