微任务在每个宏任务执行完毕后立即清空,而非插队;其队列独立、优先级高,全部执行完才进行渲染或下一个宏任务,确保promise链等逻辑可靠有序。

宏任务执行完后立即处理微任务,不是“马上插队”,而是事件循环设计的固定节奏:每个宏任务结束时,引擎会暂停宏任务调度,转而专注清空当前所有微任务——不管队列里有1个还是10个,全部执行完才继续下一个宏任务。
微任务是“紧贴宏任务尾巴”的高优先级队列
微任务不和宏任务竞争“谁先被取出来”,它根本不在宏任务队列里。它的存在位置独立(微任务队列),触发时机明确:仅在当前宏任务的同步部分彻底执行完毕、调用栈完全清空之后。这时引擎不做渲染、不取新宏任务,而是直接扫描微任务队列并逐个执行,直到队列变空。
- 哪怕你在 Promise.then 里又创建了新的 Promise.then,新回调也会被立刻加入当前微任务队列尾部,本轮继续执行
- queueMicrotask() 添加的函数同样进入这个队列,与 Promise.then 具有同等优先级
- 浏览器在清空微任务后,才会进行 UI 渲染(如页面重绘),再取下一个宏任务
宏任务之间隔着一整轮微任务清扫
一个 setTimeout 回调(宏任务)执行完,不会立刻跳到下一个 setTimeout;它必须先让出控制权,等所有已排队的微任务(包括它自己执行过程中产生的)全部跑完。这保证了像 Promise 链、响应式更新这类需要快速反馈的逻辑,总能比定时器、用户点击等更“粗粒度”的操作先得到处理。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:Promise.resolve().then(() => console.log(1)).then(() => console.log(2)),两个 .then 都属于微任务,会在同一轮中连续执行
- 而 setTimeout(() => console.log(3), 0) 虽然延迟为 0,仍要等到这一轮微任务全部结束才执行
关键不是“快”,而是“清空”
微任务的“立即”不是指毫秒级响应,而是指无条件、无中断、一次性执行完当前队列全部内容。这个“清空”行为是硬性规则,不因队列长度或耗时而中断——哪怕某个微任务执行时间较长,后续微任务也要等它完成才能开始,整个过程不会穿插宏任务或渲染。
- 这是 Promise 状态变更能可靠链式响应的基础
- 也是 MutationObserver 能在 DOM 变更后、渲染前捕获所有变化的原因
- 如果误把耗时逻辑放进微任务(比如大数组遍历),会阻塞渲染和其他宏任务,造成卡顿
实际执行顺序就是三步闭环
每一轮事件循环都严格遵循:同步代码 → 微任务队列清空 → (可选)UI渲染 → 下一个宏任务。所谓“宏任务执行完立即处理微任务”,本质是这个闭环中不可跳过的第二步——它不是可选项,而是每次宏任务落地后的强制动作。
- 整个 <script> 标签本身就是一个宏任务,所以初始同步代码跑完,就立刻进微任务阶段</script>
- setTimeout 回调作为另一个宏任务,它内部产生的 Promise.then 仍归入本轮微任务队列,而非下一轮
- 这种确定性让异步逻辑可预测,调试时只要理清任务归属,就能准确推断输出顺序
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










