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

在一个Promise中解析另一个待处理Promise,其运作机制是怎样的?

关于Promise.resolve接收Promise实例的解析机制

核心原因:Promise规范的解析流程

这完全是ES6 Promise规范中Promise Resolution Procedure(Promise解析流程)明确规定的行为,不是什么“主动检测状态”的黑魔法,而是一套标准化的处理规则:

当你调用Promise的resolve(x)时,JS会自动执行以下关键步骤:

  • 如果x是一个Promise实例(或者更宽泛的,符合thenable接口——即拥有.then()方法的对象),那么当前Promise(这里是p1)会进入pending状态,并接管x的状态生命周期:
    1. 自动调用x.then(),传入两个回调函数:一个用于x成功时触发,一个用于x失败时触发
    2. 当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'

结合你的代码示例拆解

  1. 初始化p2:它是一个pending状态的Promise,内部有6秒后执行的setTimeout
  2. 调用run(p2):创建p1时,执行res(p2),触发Promise解析流程
  3. 解析流程发现p2是Promise,订阅它的状态变化,p1进入pending
  4. 6秒后p2被resolve为'po',触发订阅的回调,p1随之被resolve为'po'
  5. p1.then()的回调执行,打印'po'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 03:42:15