宏任务执行完后立即清空全部微任务队列,再取下一个宏任务;微任务按fifo顺序执行,promise构造函数同步执行,then/catch才入微任务队列。

宏任务和微任务的执行优先级,不是靠“谁先注册谁先执行”,而是由事件循环(Event Loop)的固定流程决定的:每次宏任务执行完后,会清空当前轮次的所有微任务队列,再取下一个宏任务。
宏任务与微任务的执行顺序规则
JavaScript 的事件循环每轮只处理一个宏任务,但会一次性执行完本轮产生的所有微任务:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 宏任务包括:script 脚本整体、setTimeout、setInterval、I/O、UI 渲染等
- 微任务包括:Promise.then/catch/finally、MutationObserver、queueMicrotask()
- 执行流程:宏任务 → 微任务队列全部执行 → 下一个宏任务 → 再清空微任务……不断循环
- 注意:Promise 构造函数里的代码是同步执行的,只有 then/catch 才入微任务队列
JavaScript 中的“循环队列”不是内置结构,需手动实现
JS 没有原生循环队列(Circular Queue),但可以用数组 + 头尾指针模拟,核心是用取模(%)控制索引绕回:
- 设定固定容量 capacity,维护 head(出队位置)、tail(入队位置)、size(当前元素数)
- 入队:若队列未满,queue[tail % capacity] = item,tail++,size++
- 出队:若非空,取出 queue[head % capacity],head++,size--
- 判空:size === 0;判满:size === capacity(或 (tail + 1) % capacity === head)
常见误区提醒
容易混淆的点要特别注意:
- setTimeout(fn, 0) 不是“立刻执行”,仍是宏任务,至少等完当前脚本+所有微任务
- 多个 Promise 链式调用产生的 then,只要在同一轮事件循环中注册,就会按注册顺序依次执行(先进先出)
- queueMicrotask() 和 Promise.then 都进同一个微任务队列,遵循 FIFO,但 queueMicrotask() 更底层、无异常捕获机制
- 所谓“循环队列转换”,实际是把普通数组队列改造成空间复用的环形结构,目的是避免频繁内存分配和移动
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










