微任务队列的执行顺序是怎么确定的

微任务队列执行顺序确定:当前宏任务结束后立即连续清空队列,严格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

如何利用 Docker 数据卷标签管理生产环境下的资产分类教程
上一篇 2026-07-19 16:00
线下 “四朵金花” 最速!华为nova 16系列开售39天销量破百万台
下一篇 2026-07-19 16:00

相关推荐