微任务是javascript引擎维护的高优先级队列,确保promise.then、mutationobserver、queuemicrotask等回调在当前同步任务结束后、下一个宏任务开始前立即连续执行,不被渲染或定时器打断,从而保障状态一致性与异步行为可预测性。

微任务机制是 JavaScript 异步编程的“即时响应层”,它确保关键异步逻辑(比如 Promise 回调)在当前同步任务结束后、下一个宏任务开始前立刻执行,不被渲染或定时器打断。这层机制不是锦上添花,而是保障代码行为可预测、状态更新及时、UI 与数据保持一致的核心设计。
微任务的本质:紧贴当前执行上下文的“收尾工作”
微任务不是独立线程,而是由 JavaScript 引擎维护的一个高优先级队列。它的存在意义在于填补“同步执行结束”和“下一轮事件循环开始”之间的空隙——这个间隙若不处理,就会导致状态滞后、竞态暴露或 UI 不一致。
- 每次同步代码执行完毕(包括函数调用栈清空),引擎会立即检查微任务队列
- 只要队列非空,就逐个执行所有微任务,直到队列变空;期间不会插入任何宏任务
- 这个过程不中断、不暂停,也不受 setTimeout 延时影响(哪怕设为 0,也得等所有微任务跑完才轮到)
哪些操作会触发微任务?
常见来源有三类,它们共同构成现代异步流程的“一致性基石”:
- Promises 的链式回调:.then()、.catch()、.finally() 中传入的函数,无论 Promise 是已决议还是后续追加,都会作为微任务入队
- MutationObserver:监听 DOM 变化后触发的回调,用于精准响应结构更新(比 setTimeout 或 requestAnimationFrame 更及时)
- queueMicrotask():ES2020 标准 API,专为开发者提供手动调度微任务的能力,语义清晰、兼容性好(现代浏览器及 Node.js v12+)
为什么它在异步编程中不可替代?
微任务解决了三个关键问题:
- 避免“中间态”暴露:比如 Promise 链中 resolve 后立即 .then(),微任务保证回调在本轮结束前执行,防止外部代码读取到未更新的中间值
- 统一异步时机:相比 setTimeout 的不确定性(受系统负载、最小延迟限制),微任务执行时机严格可控,适合做状态归一、错误统一捕获等逻辑
- 支撑 async/await 语义:await 表达式背后就是 Promise + 微任务调度;没有微任务,await 就无法实现“暂停后恢复”的同步感
一个典型对比:微任务 vs 宏任务执行节奏
看这段代码的实际执行顺序,就能体会微任务的“插空”能力:
console.log(1); Promise.resolve().then(() => console.log(2)); setTimeout(() => console.log(3), 0); console.log(4);
输出一定是 1 → 4 → 2 → 3。原因很直接:1 和 4 是同步;2 是微任务,在同步结束后立刻执行;3 是宏任务,必须等微任务队列清空后,再进入下一轮事件循环才执行。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











