JS宏任务 & 微任务 API 速查表

宏任务 & 微任务 API 速查表

微任务(Microtask)API

浏览器 & Node.js 通用
javascript 复制代码
// 1. Promise(最常用)
Promise.resolve().then(() => { /* 微任务 */ })
Promise.reject().catch(() => { /* 微任务 */ })
Promise.all([]).then(() => { /* 微任务 */ })

// 2. async/await(Promise语法糖)
async function demo() {
  await Promise.resolve() // await后面的代码在微任务执行
  /* 微任务代码 */
}

// 3. queueMicrotask(现代API)
queueMicrotask(() => { /* 微任务 */ })
Node.js 特有(比微任务优先级更高)
javascript 复制代码
// 4. process.nextTick(Node.js专有)
process.nextTick(() => { /* 下一个tick执行 */ })
浏览器传统方式
javascript 复制代码
// 5. MutationObserver(兼容性方案)
const observer = new MutationObserver(() => { /* 微任务 */ })
observer.observe(element, { attributes: true })
element.setAttribute('data-trigger', '')

🟡 宏任务(Macrotask/Task)API

定时器相关
javascript 复制代码
// 1. setTimeout
setTimeout(() => { /* 宏任务 */ }, delay)

// 2. setInterval
setInterval(() => { /* 周期性宏任务 */ }, interval)

// 3. setImmediate(Node.js特有)
setImmediate(() => { /* Node.js宏任务 */ })
I/O 操作
javascript 复制代码
// 4. 各种I/O回调(Node.js)
fs.readFile('file', (err, data) => { /* I/O宏任务 */ })
http.get('url', (res) => { /* 网络宏任务 */ })

// 5. 浏览器I/O
fetch('url').then(res => { /* 网络请求 */ })
UI & 事件相关
javascript 复制代码
// 6. DOM事件
element.addEventListener('click', () => { /* 事件宏任务 */ })
element.click() // 触发事件回调(宏任务)

// 7. requestAnimationFrame(渲染相关)
requestAnimationFrame(() => { /* 下一帧前执行 */ })

// 8. requestIdleCallback(空闲时执行)
requestIdleCallback(() => { /* 空闲时执行 */ })
通信相关
javascript 复制代码
// 9. MessageChannel
const channel = new MessageChannel()
channel.port1.onmessage = () => { /* 宏任务 */ }
channel.port2.postMessage('data')

// 10. postMessage
window.addEventListener('message', () => { /* 宏任务 */ })
window.postMessage('data', '*')
其他
javascript 复制代码
// 11. 解析/加载回调
<script src="file" onload="/* 宏任务 */"></script>
<img onload="/* 宏任务 */">

// 12. Web Workers
worker.postMessage('data')
worker.onmessage = () => { /* 宏任务 */ }

🔄 执行顺序层级

Node.js 优先级
javascript 复制代码
1. 同步代码
2. process.nextTick
3. 微任务(Promise、queueMicrotask)
4. 宏任务:
   - timers阶段(setTimeout、setInterval)
   - pending callbacks(I/O回调)
   - idle/prepare(内部)
   - poll(轮询I/O)
   - check阶段(setImmediate)
   - close callbacks(关闭回调)
浏览器优先级
javascript 复制代码
1. 同步代码
2. 微任务队列(清空所有微任务)
3. 渲染(requestAnimationFrame、布局、绘制)
4. 宏任务队列(取一个执行)
5. 重复2-4

🎯 快速选择指南

需要立即/尽快执行
javascript 复制代码
// 微任务(优先级高)
queueMicrotask(() => {})      // 推荐
Promise.resolve().then(() => {})  // 传统
process.nextTick(() => {})    // Node.js最快
需要让出控制权(不阻塞UI)
javascript 复制代码
// 宏任务(给浏览器渲染机会)
setTimeout(() => {}, 0)           // 通用
requestAnimationFrame(() => {})   // 动画相关
MessageChannel                   // 高优先级宏任务
Node.js 环境
javascript 复制代码
// I/O完成后执行
setImmediate(() => {})       // check阶段
fs.readFile(callback)        // I/O回调

// 立即下一轮
process.nextTick(() => {})   // 最快
浏览器特定
javascript 复制代码
// 与渲染帧同步
requestAnimationFrame(() => {})   // 动画优化

// 空闲时执行
requestIdleCallback(() => {})     // 后台任务

// 跨上下文通信
postMessage()                     // 页面/Worker通信

📝 一句话总结

API 类型 特点
Promise.then() 微任务 最常用,立即执行
queueMicrotask() 微任务 现代API,推荐使用
setTimeout(0) 宏任务 最小延迟,让出控制权
setImmediate() 宏任务 Node.js特有,I/O后执行
requestAnimationFrame() 伪宏任务 下一帧前,适合动画
MessageChannel 宏任务 高优先级,比setTimeout快
process.nextTick() Node.js特快 比微任务还快

记住核心原则:

javascript 复制代码
	微任务:当前任务结束后立即执行
	
	宏任务:等到下一次事件循环执行
相关推荐
敲敲了个代码13 小时前
从硬编码到 Schema 推断:前端表单开发的工程化转型
前端·javascript·vue.js·学习·面试·职场和发展·前端框架
dly_blog15 小时前
Vue 响应式陷阱与解决方案(第19节)
前端·javascript·vue.js
消失的旧时光-194315 小时前
401 自动刷新 Token 的完整架构设计(Dio 实战版)
开发语言·前端·javascript
console.log('npc')15 小时前
Table,vue3在父组件调用子组件columns列的方法展示弹窗文件预览效果
前端·javascript·vue.js
我命由我1234516 小时前
SVG - SVG 引入(SVG 概述、SVG 基本使用、SVG 使用 CSS、SVG 使用 JavaScript、SVG 实例实操)
开发语言·前端·javascript·css·学习·ecmascript·学习方法
C_心欲无痕16 小时前
vue3 - markRaw标记为非响应式对象
前端·javascript·vue.js
qingyun98916 小时前
深度优先遍历:JavaScript递归查找树形数据结构中的节点标签
前端·javascript·数据结构
胡楚昊16 小时前
NSSCTF动调题包通关
开发语言·javascript·算法
熬夜敲代码的小N17 小时前
Vue (Official)重磅更新!Vue Language Tools 3.2功能一览!
前端·javascript·vue.js
小彭努力中17 小时前
1.在 Vue 3 中使用 Cesium 快速展示三维地球
前端·javascript·vue.js·#地图开发·#cesium·#vue3