You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Promise.all([])返回已决议Promise,Promise.race([])返回挂起Promise?

为什么Promise.all和Promise.race传入空数组时返回状态不同?

这确实是个容易让人困惑的细节,但本质上是由两个API的核心语义差异决定的,咱们结合它们的设计目标来拆解:

1. Promise.all([]) 立刻返回已决议的Promise

Promise.all的核心逻辑是:等待所有传入的Promise完成,然后将所有结果收集成数组决议。那当传入空数组时,相当于“没有需要等待的任务”——从逻辑上来说,“所有任务都已完成”这个条件是成立的(毕竟连任务都没有),所以它会立刻以空数组为结果,决议为fulfilled状态。

你可以验证这个行为:

console.log(Promise.all([])); // 输出 Promise {<fulfilled>: []}

这个设计其实也符合数学里“空集合全称命题为真”的逻辑——空集合里的所有元素都满足“已完成”的条件,所以Promise.all直接返回成功状态。

2. Promise.race([]) 永远处于挂起状态

Promise.race的核心逻辑是:等待传入的Promise中第一个完成的那个,然后跟随它的状态决议。当传入空数组时,没有任何Promise会触发完成事件,它永远等不到“第一个完成的Promise”,所以只能一直处于pending状态,永远不会决议。

对应的验证代码:

console.log(Promise.race([])); // 输出 Promise {<pending>}

类比现实场景的话,就像你在机场等第一个到达的航班,但根本没有航班会来,那你就只能一直等下去,不会有结果。

总结

这两个API的行为差异完全是贴合各自语义的刻意设计,不是bug——Promise.all处理空数组时认为“所有任务已完成”,而Promise.race处理空数组时因为“没有任务可以触发决议”,所以一直挂起。

内容的提问来源于stack exchange,提问作者chadoliver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:02:12