新闻中心

事件循环机制完全解读_微任务与宏任务的执行顺序

2025-12-04
浏览次数:
返回列表
J*aScript事件循环中,先执行宏任务,再清空微任务队列。例如:同步代码(宏任务)→ 微任务(如Promise.then)→ 下一个宏任务(如setTimeout)。输出顺序为1→4→3→2,因微任务在当前宏任务后立即执行,而setTimeout属于下一轮宏任务。嵌套微任务也会在本轮处理,如C→A→B所示。掌握此机制对异步编程至关重要。

事件循环机制完全解读_微任务与宏任务的执行顺序

J*aScript 是单线程语言,所有任务都在一个主线程上执行。为了协调异步操作(如定时器、网络请求、DOM 事件等)的执行,JS 引擎引入了事件循环机制(Event Loop)。理解事件循环的关键在于搞清楚宏任务(Macrotask)和微任务(Microtask)的执行顺序。

什么是宏任务与微任务?

宏任务微任务是事件循环中两种不同类型的任务队列:

  • 宏任务包括:整体代码块、setTimeoutsetIntervalI/O 操作UI 渲染postMessagesetImmediate(Node.js)等。
  • 微任务包括:Promise.then/catch/finallyMutationObserver(浏览器)、process.nextTick(Node.js)、queueMicrotask 等。

每轮事件循环中,JS 引擎会先执行一个宏任务,然后清空当前所有的微任务队列。只有当微任务队列为空时,才会进行下一轮宏任务。

执行顺序规则详解

事件循环遵循以下流程:

  • 从宏任务队列中取出第一个任务执行(比如主代码块或 setTimeout 回调)。
  • 在该宏任务执行过程中,遇到微任务时,将其加入微任务队列。
  • 当前宏任务执行完毕后,立即执行微任务队列中的所有任务,直到队列清空。
  • 微任务执行完后,可能触发 UI 渲染(浏览器环境),然后进入下一轮事件循环,取下一个宏任务。

简单说就是:一个宏任务 → 所有微任务 → 下一个宏任务 → 所有微任务……

实际例子解析

来看一段经典代码:

console.log('1');

setTimeout(() => {
  console.log('2');
}, 0);

Promise.resolve().then(() => {
  console.log('3');
});

console.log('4');

输出顺序是:1 → 4 → 3 → 2

Tunee AI Tunee AI

新一代AI音乐智能体

Tunee AI 1104 查看详情 Tunee AI

解释:

  • '1' 是同步代码,直接输出。
  • setTimeout 是宏任务,被放入宏任务队列。
  • Promise.then 是微任务,进入微任务队列。
  • '4' 是同步代码,接着输出。
  • 当前宏任务(主代码块)执行结束,开始执行微任务队列,输出 '3'。
  • 微任务清空后,进入下一轮事件循环,执行 setTimeout 回调,输出 '2'。

嵌套情况下的执行顺序

微任务可以继续注册新的微任务,这些都会在本轮宏任务结束后依次执行:

Promise.resolve().then(() => {
  console.log('A');
  Promise.resolve().then(() => {
    console.log('B');
  });
});
console.log('C');

输出:C → A → B

因为 'A' 输出后又注册了一个微任务 'B',它仍属于当前宏任务后的微任务阶段,所以会在 'A' 后立即执行,不会等到下一轮宏任务。

基本上就这些。掌握宏任务与微任务的区别以及事件循环的执行节奏,对理解异步编程、避免回调地狱、优化性能都至关重要。不复杂但容易忽略细节。

以上就是事件循环机制完全解读_微任务与宏任务的执行顺序的详细内容,更多请关注其它相关文章!


# 如何使用  # 东莞网站优化联系方式  # 网站优化方案外包  # 网站建设申请模板下载  # 披萨营销推广语言文案  # 呈贡网站seo开发  # 咸宁seo网络推广公司排名  # seo文章撰写技巧  # 东门软件网站建设  # 温州网站建设技术方案  # 沈阳和平网站优化服务商  # 都在  # 偏移量  # 本轮  # javascript  # 至关重要  # 表单  # 回调  # 清空  # 会在  # 下一轮  # 区别  # mac  # 浏览器  # node  # node.js  # js  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Python中高效访问嵌套字典与列表中的键值对  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  照顾宝贝2小游戏免费秒玩入口  ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句  Tabulator表格日期时间排序问题及自定义解决方案  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  b站怎么看视频的弹幕数量_b站弹幕数量查看方法  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  网易大神账号申诉需要多久_网易大神账号申诉流程说明  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  126邮箱账号注册 电脑版登录入口  夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案  双系统安装时,如何设置默认启动系统? msconfig命令了解一下!  Selenium Python中处理点击后新窗口加载冻结问题的策略与实践  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析  蛙漫移动版在线看 蛙漫手机浏览器直达入口  “在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法  汽水音乐在线解析 汽水音乐在线解析入口  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  12306选座如何查看座位示意图_12306座位示意图解读与使用  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  拼多多赚钱渠道_拼多多收益来源  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  京东单号查询入口_京东快递订单追踪入口  J*aScript中正确使用querySelectorAll与复杂CSS选择器  淘宝支付提示失败如何解决 淘宝支付流程优化方法  韩小圈电脑版在线入口_网页版免费登录地址  excel怎么制作工资条 excel快速生成工资条的方法  J*aScript Promise链中如何正确终止后续.then执行并处理错误  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  c++中为什么推荐使用using替代typedef_c++现代化类型别名  Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】  AO3官网镜像链接 Archive of Our Own同人文在线浏览  微信群消息显示延迟如何解决 微信群消息刷新优化方法  Python getattr() 异常处理深度解析:避免程序意外退出  J*aScript中localStorage数据的获取、清洗与格式化教程  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  Flexbox布局实践:实现粘性导航栏与底部固定页脚  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台 

搜索