宏任务是事件循环的主干节点,每次执行完才进入下一轮;常见类型包括script、setTimeout、I/O回调、UI渲染和MessageChannel;合理利用其节奏可实现分帧、节流、DOM批量更新及竞态控制。
宏任务流控制不是“手动调度任务队列”,而是理解并利用事件循环中宏任务的执行节奏,来安排耗时操作、UI更新、资源释放等关键时机。它不靠改写底层机制,而靠对执行顺序的预判和合理组织。
宏任务是事件循环的锚点——每个宏任务执行完,才进入下一轮循环。常见宏任务包括:
• script 标签整体代码(初始宏任务)
• setTimeout/setInterval 回调
• I/O 操作完成后的回调(如 fetch 的响应处理,注意:fetch 本身是宏任务触发,但 .then 是微任务)
• UI 渲染(浏览器环境,在微任务之后、下一个宏任务之前发生)
• MessageChannel.postMessage 的回调
当需要避免长任务阻塞主线程(如批量渲染、大数据处理),可主动拆解为多个宏任务,让浏览器有喘息机会:
setTimeout(() => {}, 0),防止页面卡顿宏任务是“阶段划分”,微任务是“阶段内收尾”。典型误区是把本该同步或微任务做的事硬塞进 setTimeout:
queueMicrotask 或 MutationObserver 更精准不是所有异步都该用 setTimeout。判断依据是:是否需要明确“跨帧”或“让出线程”:
requestAnimationFrame(属于宏任务)对齐屏幕刷新,比 setTimeout 更精准