微任务在每个宏任务结束后立即清空,Promise.then()、queueMicrotask()、MutationObserver按注册顺序执行;await本质是微任务调度,resolve时机决定执行顺序;UI渲染发生在微任务清空后,影响DOM更新与视觉反馈时序。

微任务执行顺序直接影响代码的时序行为和状态一致性,尤其在涉及 Promise 链、状态更新、UI 同步等场景中,稍有偏差就可能引发难以复现的 bug。
微任务会“插队”到宏任务之间
每个宏任务(如 setTimeout 回调、页面点击事件)执行完后,JS 引擎会立刻清空当前所有微任务,而不是等到下一个宏任务开始前才处理。这意味着:
- 哪怕一个微任务是在另一个宏任务执行中途生成的,它也不会立刻运行,而是排队等到当前宏任务彻底结束、调用栈清空后才统一执行
- Promise.then()、queueMicrotask()、MutationObserver 回调都遵循这一规则,且彼此之间按注册顺序依次执行
- 如果某个微任务内部又创建了新微任务(比如 .then() 里再 return Promise.resolve()),新任务会加入当前微任务队列末尾,本轮仍会被执行(即“递归清空”)
Promise 链的响应顺序取决于 resolve 时间,不是书写顺序
多个 Promise 的 .then() 回调谁先执行,不看代码位置,而看对应 Promise 实例何时完成:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- resolve 越早 → 微任务越早入队 → 越早执行
- 即使 Promise2 在代码中写在 Promise1 后面,只要它先 resolve,它的 .then() 就会先于 Promise1 的 .then() 运行
- 同一时刻 resolve 的多个 Promise,其微任务按注册顺序排队,不会乱序
UI 渲染被微任务“拦在后面”
浏览器在每轮事件循环中,会在“清空微任务队列之后、取下一个宏任务之前”,决定是否触发重绘或重排。这带来两个关键影响:
立即学习“Java免费学习笔记(深入)”;
- 连续多次修改 DOM 属性(如 classList、innerText),若都在同一个宏任务内完成,且中间没插入微任务,浏览器通常会合并渲染,只刷一次屏
- 但如果在修改后立即触发 Promise.then() 或 queueMicrotask(),那么 DOM 更新会先生效,紧接着微任务执行,然后才进入渲染阶段——这常被用来“强制触发一次更新后再做后续逻辑”
- 反过来,如果误把本该同步更新 UI 的逻辑塞进微任务,可能导致用户看到短暂的旧状态(例如表单提交后 loading 状态延迟出现)
await 本质是微任务调度器
async 函数内部的 await 并非阻塞主线程,而是将后续代码包装成微任务:
- 遇到 await promise 时,函数暂停,控制权交还给事件循环
- promise resolve 后,await 后面的语句被放入微任务队列,等待当前宏任务结束、微任务清空时执行
- 因此,多个 await 连续写,实际是串行微任务;而 Promise.all([...]) 是并行发起,响应快者先入队

















