微任务清空一定在GUI渲染之前;事件循环每完成一个宏任务后,先清空全部微任务队列(含新产生的微任务),再执行可选的GUI渲染,且渲染不会插入微任务之间或宏任务中途。

微任务清空一定在 GUI 渲染之前
在浏览器环境中,事件循环每完成一个宏任务后,会严格按顺序执行:先清空全部微任务队列,再触发一次 GUI 渲染(如 DOM 更新、样式计算、布局、绘制)。这意味着任何在微任务中修改 DOM 的操作(比如 Promise.then 里设置 element.innerText),其变更一定会在本次渲染中生效;而如果微任务还没执行完,渲染就绝不会开始。
GUI 渲染不是每次循环都发生
浏览器会根据性能策略优化渲染时机。以下情况可能导致跳过本次渲染:
- 没有发生影响视觉的 DOM 变更(例如只改了 display: none 的元素)
- 页面处于后台标签页或不可见状态
- 连续多次微任务中频繁读写 DOM,触发了渲染合并(如 layout thrashing 后被节流)
- 使用了 requestAnimationFrame 且尚未到达下一帧时机
微任务“清空”是原子性动作
微任务队列一旦开始处理,就会持续执行直到完全为空——包括执行过程中新产生的微任务。例如:
Promise.resolve().then(() => { console.log('a'); Promise.resolve().then(() => console.log('b')); });
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
输出一定是 a → b,且两者都在同一轮微任务阶段完成,早于后续任何 GUI 渲染或宏任务。
UI 渲染发生在宏任务间隙,而非微任务之间
即使有多个宏任务排队,浏览器也只会在每个宏任务执行完毕、微任务清空之后,才考虑是否渲染。它不会在两个微任务之间插入渲染,也不会在宏任务执行中途暂停去渲染。典型流程链为:
宏任务 A → 微任务队列清空 → (可选)GUI 渲染 → 宏任务 B → 微任务队列清空 → (可选)GUI 渲染
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










