执行顺序为同步代码→微任务→宏任务,每次宏任务后清空全部微任务;需按五步法分析任务类型与注册时机,警惕微任务嵌套,并用devtools验证。

关键在于掌握三类任务的执行优先级:同步代码 → 微任务 → 宏任务,且每次宏任务结束后必须清空全部微任务队列。
明确任务分类,不凭直觉判断
很多执行顺序“反直觉”,是因为误判了任务类型。例如:
- setTimeout(fn, 0) 是宏任务,哪怕延迟为 0,也得等当前宏任务+所有微任务执行完才轮到它
- Promise 构造函数内的代码是同步执行的,只有 then/catch/finally 回调才是微任务
- async 函数体是同步的,await 后面的代码会被包装成微任务(不是立即执行,而是推入微任务队列)
- queueMicrotask() 明确插入微任务,优先级和 Promise.then 一致
按事件循环步骤逐层拆解
遇到复杂代码,按以下固定节奏分析:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 第一步:找出当前宏任务(通常是整个 script 脚本或某个 setTimeout 回调)中所有同步执行的语句,按顺序列出输出
- 第二步:扫描该宏任务内注册的微任务(Promise.then、queueMicrotask 等),暂存但不执行
- 第三步:扫描该宏任务内注册的宏任务(setTimeout、setInterval 等),放入宏任务队列尾部
- 第四步:当前宏任务结束 → 立即执行所有已排队的微任务(注意:新微任务在执行中产生,也会被立刻加入本轮清空)
- 第五步:取宏任务队列头部的一个任务,作为下一轮宏任务,重复上述过程
警惕隐式微任务链与嵌套触发
微任务可以递归触发新微任务,且它们会在同一轮清空中连续执行:
- 一个 Promise.then 回调里再调用 Promise.resolve().then(...),后者会加入当前微任务队列末尾,仍属于本轮清空
- async 函数中多个 await 会生成多个微任务,按 await 出现顺序依次注册,但都排在当前宏任务之后、下一个宏任务之前
- MutationObserver 回调也是微任务,若 DOM 变更由微任务触发,可能形成微任务嵌套,需逐层展开
用浏览器开发者工具验证逻辑
光靠推理易出错,建议配合实际调试:
- 在 Chrome DevTools 的 Performance 面板中录制运行,查看 Tasks、Microtasks、Rendering 的时间线分布
- 在代码中插入 debugger,观察调用栈清空后微任务是否自动触发
- 对关键 Promise 链添加 console.timeStamp 或自定义标记,比对输出时序
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










