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><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review"><img
src="https://img.php.cn/upload/skill/000/000/081/179084711841712.jpg" alt="Java Maven Code Review" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="overflowclass">Java Maven Code Review</a>
<p class="overflowclass">审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。</p>
</div>
<a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><p>// 输出顺序:1 → 3 → 2 - 微任务
</p>与 Promise.then 的区别
两者都进入微任务队列,但有几点关键不同:
- 无额外开销:不创建 Promise 实例,避免了 Promise 构造和状态管理的开销
-
无异常穿透风险:如果传入函数抛错,不会像
Promise.then那样产生未捕获的 rejection(除非你主动 throw) - 语义明确:意图是“调度一个微任务”,而非“处理 Promise 结果”
典型使用场景
适合需要在 DOM 渲染前、但又不希望阻塞当前同步代码的轻量异步操作:
- 批量更新后统一触发回调(如虚拟列表滚动位置校正)
- 避免重复渲染:把多次状态变更合并到一次微任务中处理
- 组件卸载前清理(配合 React useEffect 或自定义生命周期)
- 替代
setTimeout(fn, 0)做更及时的响应(后者是宏任务,延迟更高)
注意事项
虽然简单,但要注意几点:
- 不能传入带参数的函数直接调用,需用箭头函数或闭包包裹:
queueMicrotask(() => fn(arg)) - 不支持链式调用或返回值,它只负责调度,不返回任何内容
- 在不支持的旧环境(如 IE、早期 Node.js Promise.resolve().then()
- 不要在微任务里无限递归调用
queueMicrotask,否则会阻塞主线程,导致页面无响应
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










