promise和settimeout执行先后的区别 promise.then和settimeout( 二 )


文章插图
B)调用堆栈执行 Promise.resolve(true).then(resolve)并安排一个解决方案 。resolved()

promise和settimeout执行先后的区别 promise.then和settimeout

文章插图
promise和settimeout执行先后的区别 promise.then和settimeout

文章插图
C)promise 立即被解析,同时计时器也立即执行 。这样,定时器回调进入任务队列,回调resolve()进入作业队列
promise和settimeout执行先后的区别 promise.then和settimeout

文章插图
D)现在是有趣的部分:作业队列(微任务)优先级高于任务队列(宏任务) 。事件循环从作业队列中取出promise回调并将其放入调用堆栈中 。然后,调用堆栈执行promise回调:
promise和settimeout执行先后的区别 promise.then和settimeout

文章插图
E)最后,事件循环将计时器回调从任务队列中出队到调用堆栈中 。然后,调用堆栈执行计时器回调:
promise和settimeout执行先后的区别 promise.then和settimeout

文章插图
调用堆栈为空,已完成脚本的执行 。
总结
为什么立即解决的 promise 比立即执行定时器处理得更快?
由于事件循环优先级的存在,因此与任务队列(存储超时的回调)相比,作业队列(用于存储已实现的Promise回调)的优先级更高 。


推荐阅读