在一个Promise中解析另一个待处理Promise,其运作机制是怎样的?
关于Promise.resolve接收Promise实例的解析机制
核心原因:Promise规范的解析流程
这完全是ES6 Promise规范中Promise Resolution Procedure(Promise解析流程)明确规定的行为,不是什么“主动检测状态”的黑魔法,而是一套标准化的处理规则:
当你调用Promise的resolve(x)时,JS会自动执行以下关键步骤:
- 如果
x是一个Promise实例(或者更宽泛的,符合thenable接口——即拥有.then()方法的对象),那么当前Promise(这里是p1)会进入pending状态,并接管x的状态生命周期:- 自动调用
x.then(),传入两个回调函数:一个用于x成功时触发,一个用于x失败时触发 - 当
x最终敲定(resolved或rejected)时,对应的回调会被执行,同时将x的结果传递给当前Promise,让当前Promise进入相同的敲定状态
- 自动调用
你问的“res如何知晓p2处于待处理状态”?
其实不存在“主动检测”的过程,而是通过订阅状态变化实现的:
当res(p2)执行时,解析流程发现p2是Promise,就会立即调用p2.then(onFulfilled, onRejected),这两个回调会被缓存起来。
- 此时
p2是pending状态,所以这两个回调不会立即执行 - 当6秒后
p2内部的setTimeout触发,调用res('po')将p2变为resolved状态,p2会触发之前缓存的onFulfilled回调 - 这个
onFulfilled回调的作用就是把p1的状态变为resolved,并将'po'作为p1的结果 - 最后
p1.then()的回调被触发,打印出'po'
结合你的代码示例拆解
- 初始化
p2:它是一个pending状态的Promise,内部有6秒后执行的setTimeout - 调用
run(p2):创建p1时,执行res(p2),触发Promise解析流程 - 解析流程发现
p2是Promise,订阅它的状态变化,p1进入pending - 6秒后
p2被resolve为'po',触发订阅的回调,p1随之被resolve为'po' p1.then()的回调执行,打印'po'
内容的提问来源于stack exchange,提问作者Nikunj Bisht
相关产品推荐
相关产品推荐

