为何我的Promise状态会从fulfilled变为pending?
问题原因解析
你看到的并不是同一个Promise的状态从fulfilled变为pending,而是两个完全不同的Promise对象:
第一个是
createPromise()返回的Promise(我们叫它P1):在showData函数内部执行时,因为data变量存在,executor会同步调用resolve,所以P1会立即进入fulfilled状态,这就是你第一次console.log(data)看到fulfilled的原因。第二个是
showData这个async函数返回的全新Promise(我们叫它P2):所有async函数的特性就是——不管你return的是什么值(普通值或另一个Promise),它都会自动创建一个新的Promise对象返回。
关键执行顺序导致状态差异:
- 调用
showData()时,同步执行内部代码:创建P1并立即让它fulfilled,打印P1,然后return P1。此时P2刚被创建,状态还是pending。 - 同步执行
console.log(promise)(这里的promise就是P2),此时同步代码还没执行完,微任务队列还没处理,P2的状态还没更新,所以打印pending。 - 同步代码执行到
console.log('print_something')后,进入微任务阶段:async函数会把P1的结果同步到P2,P2才会变为fulfilled状态。
简单说:async函数返回的新Promise,需要等当前同步代码跑完、微任务触发后,才会和你return的Promise状态同步,所以在同步打印时它还是pending。
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

