queueMicrotask是手动插入微任务的标准API,语义更清晰、性能略优,不创建Promise对象,无异常捕获干扰,执行时机与Promise.then一致,属微任务队列,在当前宏任务结束后立即按FIFO执行。

queueMicrotask 是 JavaScript 中用于**手动插入微任务(microtask)** 的标准 API,它比 Promise.resolve().then() 更直接、语义更清晰,且性能略优。它在事件循环的当前宏任务(macrotask)结束前、下一个宏任务开始前执行,属于微任务队列的一部分。
queueMicrotask 的基本用法
它接收一个函数作为参数,该函数会被加入当前微任务队列,等待本轮宏任务结束后立即执行:
queueMicrotask(() => {console.log('这是一个微任务');
});
注意:传入的必须是函数,不能是表达式或立即调用函数(IIFE),否则会报错。
它和 Promise.then 的区别
两者都插入微任务,但有几点关键不同:
立即学习“Java免费学习笔记(深入)”;
- 无副作用创建:Promise.then 需要先创建 Promise 实例,可能触发不必要的状态管理与内存开销;queueMicrotask 不创建任何对象,更轻量。
-
无异常捕获干扰:Promise.then 的回调若抛错,会变成未处理的 rejected promise;queueMicrotask 抛错会直接冒泡到全局(如触发
unhandledrejection或终止当前脚本),行为更接近普通函数调用。 -
执行时机完全一致:它们都在同一微任务阶段运行,顺序按插入先后决定(FIFO),和
Promise.then、MutationObserver回调同级。
典型使用场景
适合需要“在当前同步代码之后、但又不等到下一轮事件循环”的时机执行逻辑,例如:
- 批量更新后的统一响应:比如多次修改 DOM 后,用 queueMicrotask 做一次汇总处理,避免重复计算(类似 Vue 的 nextTick、React 的 flushSync 后的时机)。
- 避免竞态或确保执行顺序:在 setTimeout 回调中插入微任务,可确保它在 setTimeout 宏任务内执行,而非被其他宏任务打断。
- 自定义异步原语的基础构建块:比如实现简易的异步调度器、资源释放钩子、或与 MutationObserver 协作做 DOM 变更后响应。
注意事项与常见误区
使用时需注意:
- 不能在微任务中无限递归调用 queueMicrotask,否则导致微任务队列永不结束,页面卡死(浏览器通常有保护机制,但应避免)。
- 它不返回任何值(返回 undefined),无法链式调用,也不支持取消。
- 兼容性良好:Chrome 71+、Firefox 71+、Safari 15.4+、Edge 79+ 均支持;旧环境可用 Promise.fallback 模拟(但语义和错误处理略有差异)。


















