微任务是JavaScript事件循环中高优先级的异步任务,总在当前宏任务结束后一次性清空执行;其核心特征包括:宏任务末尾连续执行全部微任务、无抢占、独立队列、不可手动清空;常见API有Promise回调、queueMicrotask()、MutationObserver及Node.js的process.nextTick()。

微任务(Microtask)是 JavaScript 事件循环中一类高优先级的异步任务,它总在当前宏任务执行完、下一个宏任务开始前被**一次性清空执行**。它的核心特点是“立即但不阻塞”,用于处理需要尽快响应、又不能打断当前同步逻辑的操作。
微任务的关键特征
– 执行时机:每个宏任务结束后,引擎会检查微任务队列,并**连续执行全部待处理微任务**,直到队列为空;
– 无抢占:微任务之间不穿插宏任务,也不会被 UI 渲染或用户输入中断;
– 队列独立:有专属的 Microtask Queue,与 Macrotask Queue 互不干扰;
– 不可手动清空:开发者无法暂停、取消或跳过某个微任务,只能靠代码逻辑控制入队时机。
常见的微任务 API
以下 API 的回调函数或处理逻辑,一旦触发,就会被推入微任务队列:
-
Promises:所有
.then()、.catch()、.finally()的回调(包括 Promise 构造器内部的 resolve/reject 同步触发的后续链) - queueMicrotask():专为调度微任务设计的原生 API,接受一个函数,保证其在本轮末尾执行
- MutationObserver:监听 DOM 变化后触发的回调(如节点增删、属性变更),属于标准微任务
- process.nextTick()(仅 Node.js):虽不属于浏览器规范,但在 Node 环境中优先级高于 Promise,也归类为微任务
容易混淆的注意点
– Promise.resolve().then(...) 是微任务,但 new Promise(...) 构造器内的同步代码仍是同步执行,不入队;
– async/await 底层基于 Promise,所以 await 后的代码实际被编译为 .then(),属于微任务;
– setTimeout(() => {}, 0)、setInterval、requestAnimationFrame 都是宏任务,不是微任务;
– 没有“微任务嵌套层数限制”,但无限递归调用 queueMicrotask 或 Promise 链会导致主线程无法交还控制权,引发页面冻结。


















