queuemicrotask 是浏览器和 node.js(v11.0+)原生微任务 api,比 promise.then 更轻量、比 settimeout 更及时,用于在当前同步脚本结束后立即执行回调。
queuemicrotask 是一个浏览器和 node.js(v11.0+)原生提供的 api,用于将回调函数排入微任务队列(microtask queue),确保它在当前同步脚本执行完毕后、下一次事件循环开始前立即执行——比 settimeout(fn, 0) 更及时,也比 promise.then 更轻量直接。
为什么用 queueMicrotask 而不是 Promise.then 或 setTimeout
微任务(microtasks)具有更高优先级:它们在每次宏任务(如 JS 主线程脚本、事件处理、setTimeout 回调)结束后统一清空,且一次性执行完所有排队的微任务。相比:
-
Promise.then需要创建 Promise 实例,有额外开销,语义上偏向异步流程控制; -
setTimeout(fn, 0)属于宏任务,至少要等完当前任务 + 一次事件循环,延迟明显(通常 ≥ 1ms); -
queueMicrotask零封装、零 Promise 构造、语义清晰:「我只想在本轮同步代码之后立刻跑这个」。
基本用法:传入一个无参函数
它只接受一个函数参数,不支持传参或 this 绑定,需自行闭包或箭头函数捕获上下文:
// ✅ 正确:用闭包捕获变量
const data = { id: 123 };
queueMicrotask(() => {
console.log('微任务执行', data.id); // 123
});
// ❌ 错误:不能直接传带参函数
// queueMicrotask(handle(data)); // 立即执行了 handle!
// ✅ 正确:如果需要复用函数,提前 bind 或包装
function logId(obj) {
console.log(obj.id);
}
queueMicrotask(logId.bind(null, data));
典型适用场景
适用于需要「同步更新状态后,立刻触发响应但不阻塞当前执行」的时机,例如:
- 自定义元素中,属性变更后触发 DOM 更新(避免多次同步重排);
- 批量操作完成后统一通知观察者(如响应式框架的 effect 刷新);
- 避免“同步递归爆栈”,把后续逻辑推到微任务(如树遍历的深度优化);
- 与 Promise 链解耦:不想返回 Promise,但又要保证顺序。
注意事项
它不可取消,也不返回句柄;错误不会被自动捕获(需手动 try/catch);在 Node.js 中需注意版本兼容性(v11.0+)。另外,它不等同于“下一个 tick”——它属于本轮 microtask 队列,若已有其他微任务(如 Promise.then),会按排队顺序执行:
console.log(1); Promise.resolve().then(() => console.log(2)); queueMicrotask(() => console.log(3)); console.log(4); // 输出:1 → 4 → 2 → 3(因为 Promise.then 先于 queueMicrotask 排入,所以先执行)











