javascript事件循环中任务执行顺序为:先执行同步代码,再清空当前所有微任务,最后执行下一个宏任务;例如console.log('1')、settimeout、promise.then、queuemicrotask、console.log('5')的输出顺序恒为1→5→3→4→2。

要观察 JavaScript 事件循环中任务的执行顺序,核心是理解宏任务(macrotask)和微任务(microtask)的调度规则,并用可验证的代码主动“标记”它们的执行时机。
宏任务与微任务的层级关系
JavaScript 的事件循环每次只从宏任务队列中取出一个任务执行;该宏任务执行完后,会清空当前所有微任务队列(即执行完所有已排队的 Promise.then、queueMicrotask 回调等),然后才进入下一轮宏任务。
- 常见宏任务:setTimeout/setInterval、I/O、UI 渲染、script 标签整体执行
- 常见微任务:Promise.then/catch/finally、queueMicrotask()、MutationObserver 回调
- 注意:Promise 构造函数内部的同步代码属于当前宏任务,不是微任务
用 console.log + 时间戳直观对比执行顺序
在关键位置插入带标识和时间戳的 console.log,能清晰看到实际执行流。例如:
console.log('1 - 同步开始');
setTimeout(() => console.log('2 - setTimeout 宏任务'), 0);
Promise.resolve().then(() => console.log('3 - Promise 微任务'));
queueMicrotask(() => console.log('4 - queueMicrotask 微任务'));
console.log('5 - 同步结束');
// 输出顺序一定是:1 → 5 → 3 → 4 → 2
这个例子不依赖定时器精度,完全由事件循环规则保证顺序,可直接在浏览器控制台或 Node.js 中运行验证。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
嵌套异步场景下的观察技巧
当多个 Promise 链、setTimeout 和微任务混合时,容易误判。关键是记住两点:微任务总在当前宏任务末尾集中执行;新产生的微任务会加入本轮微任务队列末尾(而非立即执行)。
- 在 Promise.then 里再调用 queueMicrotask,它会在当前微任务之后、但仍在同一轮微任务清空过程中执行
- 在 setTimeout 回调里 new Promise,其 then 会排到下一轮微任务队列,不会插队到当前宏任务的微任务中
- 可用 performance.now() 替代 Date.now() 获取更高精度时间戳,辅助分析耗时分布
借助开发者工具深度追踪
Chrome DevTools 的 “Performance” 面板可录制并可视化事件循环行为:
- 勾选 “Screenshots” 和 “Event Log”,录制一段含大量异步操作的脚本
- 回放时展开 “Main” 线程,查看每个 Task、Microtask、Rendering 的时间块和嵌套关系
- 右键某段 Microtask 区域 → “View Tasks”,能看到具体执行了哪些回调(如 Promise.then)
这种方式不依赖日志猜测,而是真实反映 V8 引擎的实际调度行为,适合排查复杂性能问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










