宏任务执行完毕后立即清空本轮微任务队列,按FIFO顺序执行所有已加入的微任务(如Promise.then、queueMicrotask、MutationObserver、await后续代码),新产生的微任务也纳入本轮执行;清空不可中断,且不跨轮次累积。

JavaScript 中宏任务执行完毕后会立即清空当前轮次的所有微任务,这个过程是自动、不可中断且严格按队列顺序执行的。
微任务清空发生在宏任务末尾
每当一个宏任务(如 script 脚本、setTimeout 回调、setInterval 回调、I/O 回调等)执行完,引擎不会直接跳到下一个宏任务,而是检查并**一次性执行完所有已加入微任务队列的任务**,直到队列为空。
注意:这个“清空”不是指清空整个历史微任务池,而是清空**本轮宏任务结束后积攒下来的微任务队列**。新产生的微任务(比如在某个 Promise.then 里又 new Promise().then())会加入同一轮微任务队列,仍会被本次清空过程执行。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
哪些操作会注册微任务
常见触发微任务的操作包括:
立即学习“Java免费学习笔记(深入)”;
- Promise.prototype.then/catch/finally 的回调函数
- queueMicrotask() 显式加入的回调
- MutationObserver 的回调(DOM 变化监听)
- await 后续代码(本质是 Promise 链的语法糖)
典型执行顺序验证
下面这段代码能清晰体现机制:
console.log(1);
setTimeout(() => console.log(2), 0); // 宏任务
Promise.resolve().then(() => console.log(3)); // 微任务
Promise.resolve().then(() => {
console.log(4);
setTimeout(() => console.log(5), 0); // 新宏任务,下一轮
});
console.log(6);
输出顺序为:1 → 6 → 3 → 4 → 2 → 5。
说明:同步代码(1、6)先执行;宏任务 setTimeout(2) 入宏任务队列;两个 then 是微任务,被收集进当前微任务队列;宏任务结束 → 清空微任务队列(3、4)→ 下一轮事件循环取宏任务(2)→ 其中又注册了 setTimeout(5),再下一轮执行。
关键细节与常见误区
- 微任务队列是 FIFO(先进先出),但不会跨轮次累积:上一轮没执行完?不存在——每轮都必须清空。
- 微任务中抛出未捕获错误,会终止当前微任务队列后续任务的执行(但不影响已入队的其他微任务?不,实际是会中断整个本轮微任务遍历,见规范),建议始终用 .catch 或 try/catch 包裹。
-
await 后的代码属于微任务,不是同步代码。例如
async function f(){ await 1; console.log('a'); }中的 'a' 是在微任务中执行的。 - Node.js 和浏览器行为一致,但 Node.js 中还有 process.nextTick()(优先级高于 Promise.then),它属于微任务但更早执行——这是 Node 特有,不属于标准微任务队列。

















