Promise中resolve到底有什么作用?为何已完成的Promise仍可触发then回调
Promise执行逻辑说明
代码实际执行顺序
- 执行
new Promise时,传入的执行器函数为同步立即执行代码,因此首先输出inside promise,随后执行resolve("Lol!"),此时myPromise的状态立即从pending变为fulfilled,执行结果被内部存储。 - 执行百万次循环的同步阻塞代码,循环结束时
myPromise确实已经处于完成状态。 - 调用
myPromise.then(() => console.log("then!")),这里是核心规则:无论Promise当前是pending还是已完成/已拒绝状态,then传入的回调永远属于异步微任务,不会同步触发。如果Promise已经完成,该回调会直接被推入微任务队列,等待当前主线程的所有同步任务执行完毕后才会被调度。 - 执行同步代码
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
相关产品推荐
相关产品推荐

