宏任务是事件循环中由宿主环境调度的主级异步任务,每次循环只执行一个,包括setTimeout、setInterval、全局脚本、I/O回调、UI事件、requestAnimationFrame等;其关键特征是由外部环境控制入队时机,而非在同步代码中途插入。

宏任务是事件循环中被调度执行的“主级”异步任务,由浏览器或 Node.js 等宿主环境发起,每次事件循环只执行一个宏任务。它代表相对独立、耗时较长、可被观察到的执行单元。
常见的宏任务操作
以下操作在标准 JavaScript 运行环境中均属于宏任务:
- setTimeout 和 setInterval 的回调函数(即使延时为 0)
- script 标签中的全局代码(整个 JS 文件或模块的初始执行,本身就是一个宏任务)
-
I/O 操作的回调:如
fetch、XMLHttpRequest(onload)、Node.js 中的fs.readFile回调 -
UI 交互事件:如
click、input、scroll、load等事件监听器的回调 - UI 渲染任务:浏览器在宏任务后可能触发的重排(reflow)与重绘(repaint),虽不可直接调用,但属于宏任务阶段的隐式行为
- requestAnimationFrame 的回调(浏览器专属,用于动画帧同步)
-
setImmediate(仅 Node.js 环境,已基本被
process.nextTick或 Promise 替代,但仍属宏任务)
注意:宏任务不是“所有异步操作”,而是“有明确宿主调度入口”的任务
宏任务的关键特征是:由外部环境(宿主)控制其入队时机。比如 setTimeout 由定时器系统插入队列,click 由用户行为触发,fetch 由网络栈完成时通知。它们不会在当前同步代码执行中途插入,而是在本轮宏任务结束后,按队列顺序等待下一轮事件循环。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
容易混淆的情况
有些操作看似异步,但不构成宏任务:
立即学习“Java免费学习笔记(深入)”;
-
Promise.resolve().then(...)—— 属于微任务,不是宏任务 -
process.nextTick(Node.js)—— 属于微任务,且优先级高于 Promise -
MutationObserver回调 —— 微任务,DOM 变更后立即响应 - async 函数内部的 await 后代码 —— 实际生成的是 Promise 链,仍走微任务路径

















