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

为何在Promise的then方法中返回Promise.resolve()会创建两个Promise?

为什么在Promise的then回调里返回Promise.resolve()会多创建一个Promise?

这个问题得从Promise的两个核心行为说起,咱们掰开揉碎了讲:

首先,then方法本身就会创建新Promise

不管你在then的回调里返回啥——是普通字符串、数字,还是另一个Promise——then方法必然会生成并返回一个全新的Promise实例。这是Promise链式调用的根本,不然你没法一直.then()下去对吧?

就像你写的测试代码:

new PromisePlus(resolve => resolve()) // 第一个PromisePlus实例诞生
  .then(() => { return 'GOOD' }) // then方法创建第二个实例,直接把'GOOD'作为resolve值
  .then(msg => console.log(msg)) // then方法又创建第三个实例

所以会打印3次new promise created,这完全是正常操作。

然后,Promise.resolve()本身也会创建新Promise

当你在then回调里写return Promise.resolve('GOOD')时,这里发生了两件事:

  1. 调用Promise.resolve('GOOD'):这个函数本身就会创建一个新的Promise实例(哪怕你传的是普通值,它也会把值包装成一个resolved状态的Promise);
  2. then方法依然按规则创建另一个新Promise:这个Promise会“盯着”你刚才返回的那个Promise.resolve()实例,等它状态确定后,再跟着变更自己的状态。

举个对应的例子:

new PromisePlus(resolve => resolve()) // 1. 第一个实例
  .then(() => { 
    return Promise.resolve('GOOD') // 2. 这里又创建了第二个实例
  }) // 3. then方法创建第三个实例,等待第2个实例完成
  .then(msg => console.log(msg)) // 4. then方法创建第四个实例

这种情况下,你会看到4次打印——对比返回普通值的情况,多出来的那个就是Promise.resolve()自己创建的实例。

为什么原生Promise看不到这个过程?

你说没法直接用原生Promise验证,是因为原生Promise的构造函数不会像你的PromisePlus那样打印日志,但底层逻辑完全一样:Promise.resolve()一定会生成新实例,then方法也一定会生成新实例,只是你看不到日志而已。

一句话总结

返回普通值时,只有then方法创建1个新Promise;返回Promise.resolve()时,Promise.resolve()创建1个 + then方法创建1个,所以总共多了1个——这就是你疑惑的“两个而非一个”的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:13:46