queueMicrotask 是 JavaScript 中直接调度微任务的原生方法,语义清晰、性能优于 Promise.then,用于 DOM 渲染前轻量异步操作,需注意兼容性和递归调用风险。

queueMicrotask 是 JavaScript 中用于手动将函数加入微任务队列的原生方法,它比 Promise.resolve().then() 更直接、语义更清晰,且性能略优。
基本用法:传入一个函数
只需调用 queueMicrotask 并传入一个无参或带逻辑的函数即可。该函数会在当前宏任务结束后、下一个宏任务开始前执行:
console.log('1');
<p>queueMicrotask(() => {
console.log('2 - 微任务');
});</p><p>console.log('3');</p><p>// 输出顺序:1 → 3 → 2 - 微任务
与 Promise.then 的区别
两者都进入微任务队列,但有几点关键不同:
立即学习“Java免费学习笔记(深入)”;
- 无额外开销:不创建 Promise 实例,避免了 Promise 构造和状态管理的开销
-
无异常穿透风险:如果传入函数抛错,不会像
Promise.then那样产生未捕获的 rejection(除非你主动 throw) - 语义明确:意图是“调度一个微任务”,而非“处理 Promise 结果”
典型使用场景
适合需要在 DOM 渲染前、但又不希望阻塞当前同步代码的轻量异步操作:
- 批量更新后统一触发回调(如虚拟列表滚动位置校正)
- 避免重复渲染:把多次状态变更合并到一次微任务中处理
- 组件卸载前清理(配合 React useEffect 或自定义生命周期)
- 替代
setTimeout(fn, 0)做更及时的响应(后者是宏任务,延迟更高)
注意事项
虽然简单,但要注意几点:
- 不能传入带参数的函数直接调用,需用箭头函数或闭包包裹:
queueMicrotask(() => fn(arg)) - 不支持链式调用或返回值,它只负责调度,不返回任何内容
- 在不支持的旧环境(如 IE、早期 Node.js <11.0)中需做兼容:降级为
Promise.resolve().then() - 不要在微任务里无限递归调用
queueMicrotask,否则会阻塞主线程,导致页面无响应


















