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

为何resolve Promise初始状态为pending,reject却直接显示结果?

Promise resolve与reject传入已决议Promise时的状态差异原因

问题描述

当在Promise执行器中调用resolve并传入一个已resolve的Promise时,立即打印该Promise对象,其初始状态为pending(展开控制台下拉项后可看到最终结果,但此处关注初始打印时刻);而调用reject并传入同样的已resolve的Promise时,初始时刻就显示<rejected>状态。请问产生这一差异的原因是什么?

代码示例

示例1:resolve传入已resolve的Promise

const test = new Promise((resolve, reject) => {
 resolve(Promise.resolve(78))
})

console.log(test);

// 控制台输出: Promise {<pending>}

示例2:reject传入已resolve的Promise

const test2 = new Promise((resolve, reject) => {
 reject(Promise.resolve(78))
})

console.log(test2);

// 控制台输出: promise {<rejected>: Promise}

原因解析

这是因为Promise规范对resolve和reject的处理逻辑存在本质区别:

  • 调用resolve(x)时,如果x是一个Promise实例,外层Promise会启动异步解析流程:它会将自身的状态解析逻辑放入微任务队列,等待x的状态确认后再同步自身状态。由于这个过程是异步的,在你立即打印外层Promise时,解析还没开始,所以状态保持pending。
  • 而调用reject(x)时,不管x是什么类型的值(哪怕是已resolve的Promise),外层Promise会同步进入rejected状态,直接把x作为拒绝原因。这里没有异步等待的步骤,所以打印时就能直接看到<rejected>状态。

简单总结:resolve处理Promise类型的参数是异步的,reject则不管参数类型,同步完成状态变更。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:03:17