新闻中心

JS事件循环机制解析_宏任务与微任务指南

2025-11-16
浏览次数:
返回列表
事件循环先执行宏任务,再清空微任务队列。同步代码如console.log立即执行,setTimeout等宏任务进入宏任务队列,Promise.then等微任务进入微任务队列。当前宏任务结束后,依次执行所有微任务,之后再取下一个宏任务。async/await基于Promise,await后续代码被视为微任务。例如:script start→async1 start→async2→script end→async1 end→timeout,因await将“async1 end”推入微任务队列,在本轮宏任务结束后执行。

js事件循环机制解析_宏任务与微任务指南

J*aScript 的事件循环机制是理解异步编程的关键。很多人在处理 setTimeoutPromiseasync/await 时会感到困惑,原因就在于没有搞清楚宏任务(Macrotask)和微任务(Microtask)的执行顺序。下面我们就来清晰地梳理这套机制。

事件循环基础:什么是宏任务与微任务?

J*aScript 是单线程语言,所有代码都在一个主线程上执行。为了实现异步操作而不阻塞主线程,JS 引入了事件循环机制。这个机制依赖两个任务队列:

  • 宏任务队列(Macrotask Queue):也叫任务队列,用于存放宏任务。常见的宏任务包括:setTimeoutsetIntervalI/O 操作UI 渲染script 标签中的整体代码
  • 微任务队列(Microtask Queue):优先级高于宏任务。常见的微任务包括:Promise.then/catch/finallyqueueMicrotaskMutationObserver(浏览器环境)。

每次事件循环开始时,先执行当前宏任务中的同步代码,然后清空微任务队列,再取下一个宏任务执行,如此反复。

执行顺序规则:宏任务与微任务如何调度?

事件循环遵循以下流程:

  • 从宏任务队列中取出一个任务执行(比如 script 主代码块或 setTimeout 回调)。
  • 执行过程中遇到同步代码,直接运行。
  • 遇到微任务(如 Promise.then),将其加入微任务队列。
  • 当前宏任务执行完毕后,立即清空微任务队列中所有任务,按先进先出顺序执行。
  • 微任务清空后,进入下一轮事件循环,取下一个宏任务执行。

关键点是:每完成一个宏任务,就会把所有当前可用的微任务执行完。

实际例子:看懂输出顺序

来看一段经典代码:

console.log('start');

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

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

console.log('end');

输出结果为:

Kreado AI Kreado AI

Kreado AI是一个多语言AI视频创作平台,只需输入文本或关键词,即可创作真实/虚拟人物的多语言口播视频。 为创作者提供AI赋能

Kreado AI 182 查看详情 Kreado AI
start
end
promise
timeout

解释:

  • “start” 是同步代码,最先输出。
  • setTimeout 是宏任务,被放入宏任务队列。
  • Promise.then 是微任务,进入微任务队列。
  • “end” 是同步代码,紧接着输出。
  • 当前宏任务(主 script)执行完,开始执行微任务,输出 “promise”。
  • 微任务清空后,进入下一轮事件循环,执行 setTimeout 回调,输出 “timeout”。

async/await 与微任务的关系

async 函数返回一个 Promise,而 await 后面的表达式完成后,其后续代码会被当作微任务处理。

async function async1() {
  console.log('async1 start');
  await async2();
  console.log('async1 end');
}

async function async2() {
  console.log('async2');
}

console.log('script start');

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

async1();

console.log('script end');

输出为:

script start
async1 start
async2
script end
async1 end
timeout

注意 “async1 end” 在 “script end” 之后输出,是因为 await 相当于把后面的代码包装成 Promise.then,属于微任务。

基本上就这些。掌握宏任务和微任务的执行时机,就能准确预测异步代码的输出顺序。不复杂但容易忽略细节。

以上就是JS事件循环机制解析_宏任务与微任务指南的详细内容,更多请关注其它相关文章!


# 下一轮  # 咸阳营销推广  # 佛山外包seo公司  # 网站推广是指什么意思啊  # 网站推广方案人员安排  # 菏泽网站优化怎么样  # 黄州seo推广电话地址  # 延庆区网站建设费用  # 合肥经开区网站排名优化  # 卫辉附近网站建设工程  # 域名对seo重要吗  # 结束后  # 器中  # 是一个  # js事件循环  # 多语言  # 回调  # 但不  # 是怎样  # 清空  # 关键词  # ai  # mac  # 浏览器  # js  # java  # javascript  # 宏任务微任务 


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


相关推荐: 解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  押井守高度称赞《辐射4》:玩了八年都停不下来!  铃兰之剑为这和平的世界希里技能组及加点推荐  Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法  实现全屏滚动与导航点:专业教程  漫蛙漫画官方首页 漫蛙2漫画在线阅读入口  Archive of Our Own官网直达 AO3最新可用地址一览  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  高德地图沿途添加点失败如何解决 高德多点规划方法  2026春节假期时间安排 2026春节假日查询  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  最新韩小圈网页版登录入口_官网在线观看官方链接  AO3官方可用镜像 Archive of Our Own网页版最新入口  steam官方网页快速访问 steam账号注册全流程  优化Django表单:提交验证失败后保留用户输入  J*aScript中针对特定容器内图片动画的实现教程  qq音乐在线播放入口_qq音乐电脑版登录链接  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  Go语言中JSON数据解析与字段访问教程  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分  sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤  自定义Bag-of-Words实现:处理带负号的词汇权重  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  在Pyomo中实现基于变量的条件约束:Big-M方法详解  如何更改在 Excel 中打开超链接时的默认浏览器  cad如何更改注释性对象的比例_cad注释性比例调整方法  夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案  在哪找SublimeJ远程工具_SFTP插件配置教程  UC浏览器网页版登录入口官网 电脑版网址入口  steam官方入口大全 steam账号注册及操作指南  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  Go语言中高效处理x-www-form-urlencoded表单数据  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  QQ网页版官方账号入口 QQ网页版网页版登录指南  cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法  12306几点到几点不能订票? | 官方最新系统维护时间全解析  谷歌google账号注册详细步骤 谷歌账号注册官方教程  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  小米汽车11月交付量突破40000台!雷军:将继续努力  J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  Django表单提交验证失败后保持字段值不刷新  C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果 

搜索