You need to enable JavaScript to run this app. JavaScript中存储函数返回Promise的变量打印为何显示Promise { <pending> }?
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中存储函数返回Promise的变量打印为何显示Promise { <pending> }?

为什么你赋值得到的Promise始终显示pending?

核心原因拆解

  • 首先明确最容易踩的认知误区:你赋值给obj的根本不是my()返回的原始Promise。
    Promise的链式调用规则决定了,每一次调用.then()/.catch()都会生成一个全新的独立Promise实例,和前序的Promise没有状态绑定关系。你写的my().then().catch()实际的返回链路是:
    1. 调用my()生成第一个原始PromiseP1,执行器同步运行:因为move的值为false,P1会立刻进入rejected状态。
    2. 对P1调用.then()生成中间PromiseP2,因为P1已经是rejected状态,then的成功回调会被直接跳过。
    3. 对P2调用.catch()生成最终的PromiseP3——这个P3才是被赋值给obj的变量,和最开始的P1完全是两个不同的实例。
  • 其次,Promise的初始状态必然是pending,状态流转是异步执行的。
    哪怕你的Promise最终一定会被resolve或reject,实例刚创建的时候一定是pending状态。所有绑定在.then/.catch上的回调都属于微任务,必须等当前同步代码全部执行完成后才会排队运行。如果在回调执行前就引用这个Promise做打印,必然会看到pending的初始状态。
  • 你等3秒仍看到pending,本质是Chrome控制台的显示缓存问题。
    当你把一个对象引用传给console.log时,控制台不会立刻把对象的所有属性值做快照存储,只会在面板上保留一个指向原对象的引用指针。如果打印瞬间Promise还处于pending状态,控制台的预览文本就会固定显示Promise {<pending>},哪怕后续Promise状态已经落定,这个预览文本也不会自动刷新。你可以手动展开这个Promise实例,就能看到它实际的状态其实已经是fulfilled了。

你这段代码的实际执行流程

代码从上到下同步执行完后,微任务队列会立刻排队执行catch里的回调,打印my error。等这个回调执行完成,P3也就是obj会直接进入fulfilled状态,返回值是回调里没有显式返回的undefined——整个过程耗时不到1毫秒,根本不需要等3秒的定时器触发。你看到的pending只是控制台的显示预览,不是Promise本身真的没有完成。

可复现的验证方法

  • 不要直接把Promise对象传给console.log,可以通过后续链式调用拿到它的最终状态:在setTimeout的回调里写obj.then(res => console.log("obj最终值:", res)),就能正常看到它的完成状态。
  • 如果想要拿到原始Promise的状态,可以单独把my()的返回值存成变量,不要把链式调用的结果覆盖掉原始引用,就能看到原始Promise在微任务执行完成后的真实状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 13:24:04