微任务队列执行顺序确定:当前宏任务结束后立即连续清空队列,严格FIFO;不同宏任务的微任务不共享队列、不跨轮竞争;执行不可中断,UI渲染须待队列为空。

微任务队列的执行顺序是确定的,核心规则只有一条:当前宏任务执行完毕后,必须立即、连续、无中断地清空整个微任务队列。
队列内部严格遵循 FIFO(先进先出)
所有进入微任务队列的任务,按注册顺序排队:
- Promise.then/catch/finally 回调,按 .then 出现的先后顺序入队
- queueMicrotask() 调用也按调用顺序入队
- MutationObserver 的回调同样遵守该顺序
- 新产生的微任务(比如在某个 then 里又调用 Promise.resolve().then)会追加到当前队列末尾,继续执行,不会跳过或插队
“本轮”与“下轮”的边界非常明确
微任务只属于触发它的那个宏任务所对应的事件循环轮次:
- script 标签里的同步代码执行完 → 清空这一轮积累的所有微任务
- setTimeout 回调执行完 → 清空它自己这轮产生的微任务(和 script 那轮无关)
- fetch 成功回调执行完 → 清空它这轮产生的微任务
- 不同宏任务产生的微任务,彼此不共享队列,也不跨轮竞争
没有外部干扰,执行过程不可打断
一旦开始清空微任务队列,JavaScript 引擎不会插入任何其他操作:
- 不会响应新的用户点击、网络响应或定时器到期
- UI 渲染要等到微任务队列彻底为空之后才可能发生(浏览器中)
- 即使某个微任务抛出未捕获错误,也不会中断后续微任务执行(错误会被记录,但队列照常清空)
注意一个常见混淆点
所谓“不可预测”,不是指队列内部顺序乱,而是指多个宏任务的触发时机受外部因素影响:
- 谁先发起 fetch、谁先触发 setTimeout、谁的事件监听器先绑定——这些无法精确控制
- 因此 A 宏任务产生的微任务 和 B 宏任务产生的微任务,谁先执行,取决于 A 和 B 哪个宏任务先跑完
- 但只要 A 先跑完,A 的全部微任务就一定在 B 的任何微任务之前执行完毕
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/jiquanzatan/126865.html