为何在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')时,这里发生了两件事:
- 调用
Promise.resolve('GOOD'):这个函数本身就会创建一个新的Promise实例(哪怕你传的是普通值,它也会把值包装成一个resolved状态的Promise); 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
相关产品推荐
相关产品推荐

