JavaScript-同步和异步任务

在 JavaScript 中,任务的执行分为 同步任务异步任务 。异步任务又进一步分为 宏任务(Macro Task)微任务(Micro Task)

同步任务

同步任务是按照代码顺序依次执行的任务,会阻塞后续代码的执行,直到当前任务完成。

异步任务

异步任务不会阻塞后续代码的执行,他们会在未来某个时间点执行

宏任务

宏任务是指那些在事件循环中被放入"宏任务队列"的任务。宏任务的执行通常会触发一次完整的事件循环迭代。通常包括:

  1. setTimeoutsetInterval:定时器任务。
  2. setImmediate(Node.js环境):立即执行的任务。
  3. requestAnimationFrame(浏览器环境):用于浏览器重绘和重排的任务。
  4. I/O操作(Node.js环境):文件读取、网络请求等。

宏任务的特点

  • 宏任务的执行会触发一次完整的事件循环迭代。
  • 宏任务队列中的任务按照先进先出(FIFO)的顺序执行。
  • 每次事件循环迭代中,宏任务队列中的任务会依次执行,直到队列为空。

微任务

微任务是指那些在事件循环中被放入"微任务队列"的任务。微任务的执行优先级高于宏任务,且会在当前执行栈清空后立即执行。常见的微任务包括:

  • Promise.then()Promise.catch()Promise.finally()
  • process.nextTick(Node.js)
  • MutationObserver(浏览器)

微任务的特点

  • 微任务的执行优先级高于宏任务。
  • 微任务队列中的任务会在当前执行栈清空后立即执行,而不是等待事件循环的下一次迭代。
  • 微任务队列中的任务会按照先进先出(FIFO)的顺序执行,直到队列为空。

事件循环的执行顺序

  1. 执行所有的同步任务
  2. 执行所有的微任务
  3. 执行一个宏任务
  4. 重复步骤2和3直至所有的任务完成

示例

js 复制代码
console.log("1. 同步代码开始");

setTimeout(() => { // 宏任务
  console.log("2. 宏任务:setTimeout");
});

Promise.resolve().then(() => { // 微任务
  console.log("3. 微任务:Promise.then");
});

console.log("4. 同步代码结束");

输出结果:

js 复制代码
1. 同步代码开始
4. 同步代码结束
3. 微任务:Promise.then
2. 宏任务:setTimeout

总结

  • 宏任务 :执行优先级较低,通常涉及事件循环的完整迭代,如setTimeoutsetIntervalsetImmediate等。
  • 微任务 :执行优先级较高,会在当前执行栈清空后立即执行,如Promise的回调、MutationObserverqueueMicrotask()等。
  • 执行顺序:事件循环会先执行同步代码,然后执行微任务队列,最后执行宏任务队列。
相关推荐
wordbaby22 分钟前
脱离 Tab 栏的艺术:React Native 全屏子页面的导航架构实践
前端·react native·harmonyos
陈随易40 分钟前
Redis 8.8发布,一定要更新
前端·后端·程序员
wordbaby1 小时前
React Native 新架构落地鸿蒙:跨三端政务级应用的工程实践与深度复盘
前端·react native·harmonyos
晓说前端1 小时前
第一篇:为什么学TypeScript?—— 优势、场景与环境搭建
javascript·ubuntu·typescript
excel2 小时前
为什么我推荐使用 Termius:现代 SSH 工具的完整体验
前端·后端
ZC跨境爬虫2 小时前
模块化烹饪小程序开发日记 Day7:(菜谱详情接口开发与JSON数据读取全流程)
前端·javascript·css·ui·微信小程序·json
এ慕ོ冬℘゜3 小时前
JS 前端基础面试题
开发语言·前端·javascript
LaughingZhu3 小时前
Product Hunt 每日热榜 | 2026-05-25
前端·人工智能·经验分享·chatgpt·html
IT_陈寒4 小时前
Java的Optional差点让我掉坑里,这几个坑你别踩
前端·人工智能·后端
粉嘟小飞妹儿4 小时前
JavaScript对象创建的几种灵活方法
前端