queuemicrotask 是 javascript 中手动将回调加入微任务队列的原生方法,它在当前宏任务结束后、所有已排队 promise 回调执行完但渲染前异步执行,支持闭包传参,不可取消,现代浏览器及 node.js 广泛支持。

queueMicrotask 是 JavaScript 中用于**手动将回调函数加入微任务队列**的原生方法。它会在当前宏任务(如脚本执行、事件处理、setTimeout 回调等)结束后、下一个宏任务开始前,**立即异步执行传入的函数**,且保证在所有已排队的 Promise.then/catch/finally 回调之后、但在渲染或下一轮事件循环之前运行。
基本用法:直接传入一个函数
只需调用 queueMicrotask 并传入一个无参或带闭包逻辑的函数即可:
queueMicrotask(() => console.log('这是微任务'));queueMicrotask(function() { /* 任意同步逻辑 */ });- 支持箭头函数、普通函数、具名函数,也支持访问外部变量(闭包)
执行时机:比 Promise.then 稍晚,但早于下个宏任务
虽然 Promise.then 回调也是微任务,但规范规定:由 queueMicrotask 排队的任务,排在当前轮次所有已存在的 Promise 微任务之后。例如:
console.log(1); Promise.resolve().then(() => console.log(2)); queueMicrotask(() => console.log(3)); console.log(4); // 输出顺序:1 → 4 → 2 → 3
这是因为 Promise.then 的微任务在 resolve 时已入队;而 queueMicrotask 调用发生在脚本同步执行中,其任务被追加到本轮微任务队列末尾。
典型使用场景
-
避免同步阻塞又不想进下一轮宏任务:比如在组件更新后、DOM 渲染前做轻量级协调(类似 Vue 的
nextTick底层之一) -
统一异步调度,替代 hack 方式:过去常用
Promise.resolve().then(fn)模拟微任务,现在可直接用更语义化、性能略优的queueMicrotask - 确保执行顺序可控:当需要严格晚于所有已触发的 Promise 回调时(例如清理、收尾逻辑)
注意事项
- 不接受参数传递,如需传参请用闭包或箭头函数包裹:
queueMicrotask(() => fn(a, b)) - 若回调抛出未捕获错误,会作为未处理的微任务拒绝(unhandledrejection),可能触发全局
unhandledrejection事件 - 浏览器兼容性良好(Chrome 71+、Firefox 71+、Safari 15.4+、Edge 79+),Node.js 11.0+ 支持
- 不能取消或等待,纯“发射即忘”式调度
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











