两段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。
各自的异步执行顺序
第一段代码执行流程
- 同步执行
new Promise()的executor:connect为false,调用rejectFunction,原始Promise变成rejected状态。 - 调用原始Promise的
.then(),返回一个新Promise,赋值给myPromise。 - 同步执行
console.log(myPromise):此时新Promise的回调还在微任务队列,状态为pending。 - 当前同步代码执行完毕,开始处理微任务队列:执行
.then()里的reject回调,打印Bad Error: Connection Failed,同时把myPromise的状态改成fulfilled(因为回调没有返回Promise,默认返回resolved的Promise)。
第二段代码执行流程
- 同步执行
new Promise()的executor:connect为true,调用resolveFunction,myPromise2变成fulfilled状态,结果值为Connection Established。 - 同步执行
console.log(myPromise2):此时myPromise2状态已经是fulfilled,直接打印该状态。 - 调用
myPromise2.then(),把回调放到微任务队列。 - 当前同步代码执行完毕,处理微任务队列:执行
.then()里的resolve回调,打印Good Connection Established。
内容的提问来源于stack exchange,提问作者Garajabite
相关产品推荐
相关产品推荐

