JavaScript事件循环中,宏任务执行完后立即清空微任务队列;微任务包括Promise.then、queueMicrotask等,优先级高于setTimeout等宏任务;示例输出为1→4→3→2。

JavaScript 会自动在每个宏任务执行完毕后,立即、无条件地调度并清空所有当前微任务队列——你不需要手动“触发”或“优先调度”,这是事件循环的内置规则。
微任务天然具有最高调度优先级
只要当前宏任务(比如 setTimeout 回调、整体 script、点击事件处理函数)执行结束、调用栈清空,引擎就会立刻检查微任务队列。如果有 Promise.then、queueMicrotask、MutationObserver 等回调,它们会按入队顺序依次执行,直到队列为空,之后才取下一个宏任务。
这个机制是强制的、不可跳过、也不可延迟的。
哪些操作能产生微任务
确保你使用的是标准微任务源,而非误写成宏任务:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
- ✅ 正确(微任务):Promise.resolve().then(...)、Promise.reject().catch(...)、Promise.finally(...)、queueMicrotask(callback)、MutationObserver 回调
- ❌ 错误(宏任务):setTimeout(..., 0)、setInterval、fetch 的 .then 是宏任务里的回调,但 fetch 本身不直接产生微任务;注意 fetch().then() 中的 then 是微任务,但整个 fetch 异步过程由浏览器调度,完成后再把 then 推入微任务队列
避免常见干扰行为
有些写法看似“想提前执行”,反而破坏微任务时机:
- 不要在 setTimeout 回调里再套 setTimeout(0) 试图“插队”——它仍是新宏任务,要等当前轮次所有微任务跑完后才排队
- 不要用 while 循环同步阻塞主线程,否则微任务永远没机会执行(浏览器可能卡死或报错)
- 不要混淆 Node.js 特有的 process.nextTick:它比 Promise.then 更早执行,属于“微任务中的 VIP”,但仅限 Node 环境,浏览器不支持
一个可靠验证示例
运行以下代码,输出顺序就是事件循环最真实的调度证据:
console.log('1'); // 同步
setTimeout(() => console.log('2'), 0); // 宏任务
Promise.resolve().then(() => console.log('3')); // 微任务
console.log('4'); // 同步
// 输出:1 → 4 → 3 → 2
这说明:同步代码走完 → 立即执行全部微任务(3)→ 再取下一个宏任务(2)。

















