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

两段JavaScript Promise代码状态差异及异步执行顺序解析咨询

两段Promise代码的差异与执行顺序解析

核心差异:变量指向的Promise实例不同

这两段代码最本质的区别是:你打印的不是同一个Promise实例。

第一段代码:myPromise是.then()返回的新Promise

const myPromise = new Promise(/* executor */).then(/* 回调 */);
console.log(myPromise);

这里的myPromise不是你用new Promise()创建的原始实例,而是.then()方法返回的全新Promise对象。

Promise的.then()/.catch()/.finally()方法都会返回一个新Promise,这个新Promise的状态要等.then()里的回调函数执行完才会确定。而回调函数是被放到微任务队列里的,不会同步执行。

当你执行console.log(myPromise)时,当前同步代码还没跑完,微任务队列里的.then()回调还没执行,所以这个新Promise的状态自然是pending。

第二段代码:myPromise2是原始Promise实例

const myPromise2 = new Promise(/* executor */);
console.log(myPromise2);
myPromise2.then(/* 回调 */);

这里的myPromise2就是你直接用new Promise()创建的原始实例。

Promise的executor函数(即new Promise()里的箭头函数)是同步执行的:当你创建Promise实例时,executor会立刻执行,里面的resolve或reject会马上把Promise的状态改成fulfilled或rejected。所以当你执行console.log(myPromise2)时,这个Promise的状态已经确定了,不会是pending。

各自的异步执行顺序

第一段代码执行流程

  1. 同步执行new Promise()的executor:connect为false,调用rejectFunction,原始Promise变成rejected状态。
  2. 调用原始Promise的.then(),返回一个新Promise,赋值给myPromise。
  3. 同步执行console.log(myPromise):此时新Promise的回调还在微任务队列,状态为pending。
  4. 当前同步代码执行完毕,开始处理微任务队列:执行.then()里的reject回调,打印Bad Error: Connection Failed,同时把myPromise的状态改成fulfilled(因为回调没有返回Promise,默认返回resolved的Promise)。

第二段代码执行流程

  1. 同步执行new Promise()的executor:connect为true,调用resolveFunction,myPromise2变成fulfilled状态,结果值为Connection Established。
  2. 同步执行console.log(myPromise2):此时myPromise2状态已经是fulfilled,直接打印该状态。
  3. 调用myPromise2.then(),把回调放到微任务队列。
  4. 当前同步代码执行完毕,处理微任务队列:执行.then()里的resolve回调,打印Good Connection Established。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 08:06:21