微任务和宏任务由js引擎与宿主环境约定调度规则,微任务由引擎原生触发(如promise.then)、宏任务由宿主提供(如settimeout);每轮事件循环执行一个宏任务后清空全部微任务队列,顺序为同步→微任务→宏任务。

微任务和宏任务的区分关键看谁发起、何时执行、队列位置和优先级。它们不是靠写法判断,而是由 JavaScript 引擎和宿主环境共同约定的调度规则决定的。
看任务来源:谁创建的,就属于哪一类
微任务由 JS 引擎原生机制触发,强调“尽快响应当前操作结果”;宏任务由宿主环境(浏览器/Node.js)提供,代表一次相对独立的异步工作单元。
-
典型微任务:Promise 的
.then/.catch/.finally回调、MutationObserver回调、queueMicrotask()注册的任务、Node.js 中的process.nextTick() -
典型宏任务:
setTimeout/setInterval回调、requestAnimationFrame、I/O 回调(如fetch完成后进入的回调)、DOM 事件(click、input等)、脚本整体执行(<script></script>标签内容)
看执行时机:顺序固定,不可跳过
事件循环每轮只取一个宏任务执行,但每次宏任务结束后,会清空整个微任务队列——不是执行一个,而是执行所有已排队的微任务,直到队列为空。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 同步代码执行完 → 立即执行所有待处理的微任务(哪怕新微任务在执行中又产生)
- 微任务队列清空 → 才从宏任务队列取下一个(比如 setTimeout 回调)
- 这个“宏→微→宏→微…”的节奏是硬性流程,不因代码写法改变
看实际调度表现:用简单例子验证
下面这段代码能清晰体现调度逻辑:
console.log('1');setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
输出一定是:1 → 4 → 3 → 2。因为:
- '1' 和 '4' 是同步任务,立刻执行
- Promise.then() 进入微任务队列,同步代码结束后立即执行 → 输出 '3'
- setTimeout 回调进宏任务队列,要等当前轮微任务全部跑完,才轮到它 → 输出 '2'
注意几个易混淆点
-
Promise.resolve().then(...)是微任务;但setTimeout(() => Promise.resolve().then(...), 0)中的 then 就属于下一轮微任务——它依附于外层 setTimeout 这个宏任务的执行时刻 -
async/await内部的 await 后代码,本质是被编译为 Promise.then,所以也属于微任务 - 多个
queueMicrotask或嵌套 Promise.then,都会按注册顺序依次执行,不会被宏任务打断
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










