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

Promise中resolve到底有什么作用?为何已完成的Promise仍可触发then回调

Promise执行逻辑说明

代码实际执行顺序

  1. 执行new Promise时,传入的执行器函数为同步立即执行代码,因此首先输出inside promise,随后执行resolve("Lol!"),此时myPromise的状态立即从pending变为fulfilled,执行结果被内部存储。
  2. 执行百万次循环的同步阻塞代码,循环结束时myPromise确实已经处于完成状态。
  3. 调用myPromise.then(() => console.log("then!")),这里是核心规则:无论Promise当前是pending还是已完成/已拒绝状态,then传入的回调永远属于异步微任务,不会同步触发。如果Promise已经完成,该回调会直接被推入微任务队列,等待当前主线程的所有同步任务执行完毕后才会被调度。
  4. 执行同步代码console.log("finished"),输出finished,此时当前主线程的同步任务全部执行完毕,开始处理微任务队列,执行之前存入的then回调,最后输出then!。

为什么去掉resolve("Lol!")后没有then!输出

如果不调用resolve,myPromise会一直保持pending状态,then绑定的回调需要等待Promise状态变更后才会被推入微任务队列,状态不变更的情况下回调永远不会被触发,因此不会输出then!。

常见误区纠正

你之前的认知错误在于:认为Promise完成后再绑定then回调不会触发,实际上Promise会永久保存自身的状态和执行结果,只要状态变为fulfilled/rejected,不管什么时候绑定对应的then/catch回调,都会被触发,只是所有回调都会遵循异步微任务的调度规则,必须等当前同步栈清空后才会执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:36:05