为何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
相关产品推荐
相关产品推荐

