queueMicrotask()用于手动创建微任务,接收函数参数并在当前宏任务结束后、下一个宏任务开始前执行;它不返回值、不支持链式调用、无状态管理、不捕获异常,适用于DOM读取、状态更新合并等场景,但不兼容IE及部分旧版Safari。

直接调用 queueMicrotask() 即可手动创建一个微任务。 它接收一个函数作为参数,该函数会在当前宏任务结束后、下一个宏任务开始前,被插入到微任务队列中执行。
基本用法
语法非常简单:
queueMicrotask(() => {
console.log('这是一个微任务');
});
与 Promise.then 的区别
两者都属于微任务,但有关键差异:
-
queueMicrotask不返回任何值,不支持链式调用;Promise.then返回新 Promise,可链式使用 -
queueMicrotask更轻量,无状态管理开销,适合纯调度场景 -
queueMicrotask不会捕获或传播异常(异常会直接抛出,不会被后续catch捕获)
常见使用场景
适合在当前同步代码结束、但还不能等到下次事件循环时执行的逻辑:
- 组件更新后立即读取 DOM(如获取渲染后的尺寸)
- 避免重复合并状态更新(类似 React 的 flushSync 之外的轻量替代)
- 在 Promise 构造器中“延迟”执行某些副作用,又不想触发 Promise 状态变化
注意点
几个容易忽略的细节:
- 必须传入函数,传其他类型(如字符串、数字)会报
TypeError - 如果函数内部抛错,会作为未处理的拒绝(unhandled rejection)被报告(即使外面有 try/catch,也捕获不到)
- 它不兼容 IE 和部分老版本 Safari,需检查运行环境或使用 polyfill(如基于
Promise.resolve().then()回退)


















