当前位置: 首页 > news >正文

浏览器事件循环(Event Loop)

彻底搞懂!

有多少种任务:同步任务,微任务,宏任务

在 JavaScript 引擎(V8)的字典里,根本没有“异步任务”这个词,只有“同步任务”和“回调函数”。

同步任务属于宏任务,但宏任务不一定是同步任务。所有的同步代码,其实都是第一个默认的“宏任务”。

真正的微任务只有这几个:Promise.then/catch/finally、MutationObserver、queueMicrotask。

常见的宏任务:setTimeout、setInterval、I/O操作、UI 渲染、全局 script 代码。普通的异步请求(如 fetch / ajax)虽然它们是异步的,但它们属于 I/O 操作,执行完后的回调会被放入宏任务队列中等待执行。

有多少种任务队列:微任务队列,宏任务队列

类比:厨师为js引擎(单线程)即一整个js代码片段,厨师要做什么菜是同步任务,客人又点了可乐但是厨师在炒饭,所以厨师直接给了服务员(webapis)去做可乐(“异步任务”-区分同步任务的说法,这里的可乐我们给他设定为promise.then),在做完菜之后,微任务有插队机制,所以厨师需要先给可乐,结束所有微任务之后再给炒饭,之后厨师就回去做下一道菜,从宏任务里面取出同步任务继续循环。

【执行一个宏任务】 ➡️ 【清空所有微任务】 ➡️ 【执行下一个宏任务】 ➡️ 【清空所有微任务】...(无限循环)

console.log('1. 同步代码'); setTimeout(() => { console.log('2. setTimeout 宏任务'); // 注意:在宏任务内部又产生了微任务 Promise.resolve().then(() => { console.log('7. 第一个 setTimeout 里的微任务'); }); }, 0); setTimeout(() => { console.log('8. 第二个 setTimeout 宏任务'); }, 0); Promise.resolve().then(() => { console.log('3. Promise 微任务'); }); async function asyncFn() { console.log('4. async 函数内的同步代码'); await Promise.resolve(); console.log('5. async 函数内 await 后的代码'); } asyncFn(); console.log('6. 同步代码结束');

✅ 正确的打印顺序是:1 -> 4 -> 6 -> 3 -> 5 -> 2 -> 7 -> 8

阅读整个js片段,js引擎开始执行,同步代码直接输出,将微任务放入微任务队列,宏任务放入宏任务队列

第一轮:

console输出1

第一个settimeout的回调进入宏任务,不管

第二个settimeout的回调进入宏任务,不管

promise的回调,进入微任务,不管

调用函数asyncFn() -> 进入内部 -> console输出4 -> await 关键字后面的代码,相当于被放进了 Promise.then 中,所以直接进入微任务,不管

console输出6

结果:1 4 6

第二轮:

检查微任务队列

promise的回调,console输出3

await 关键字后面的代码,console输出5

结果:1 4 6 3 5

第三轮:

检查宏任务队列

第一个settimeout,console输出2,后面跟了一个promise的回调,进入微任务,不管

这个时候当前宏任务结束,在下一个宏任务开始之前,检查微任务队列

结果:1 4 6 3 5 2

第四轮:

检查微任务队列

promise的回调,console输出7,微任务结束

结果: 1 4 6 3 5 2 7

第五轮:

检查宏任务队列

第二个settimeout,console输出8

结果:1 4 6 3 5 2 7 8

http://www.jsqmd.com/news/1164917/

相关文章:

  • 阿尔忒弥斯3号登月候选:9个月球着陆点!
  • SOME/IP 服务与客户端开发:从 FIDL 定义到 CommonAPI 代码生成的 5 步实践
  • 4 种有效方法助您在 iPhone 恢复出厂设置后恢复联系人
  • Kimi编程实战指南:从AI工具到工程级第七根手指
  • 西部数据移动硬盘驱动下载 详细安装步骤教程
  • 视频生成API延迟实测:五大模型从请求到出片要等多久
  • 项目生命周期 4 阶段与 DevOps 实践:从定义到交付的敏捷融合
  • MoE稀疏混合专家模型原理与Hy3部署实践:降低大模型推理成本
  • 2026年7月车制辊筒/电动辊筒靠谱生产商推荐_江苏德胜智能物流设备有限公司 - 品牌宣传支持者
  • Unity恐怖游戏资源包导入、材质修复与AI整合实战指南
  • 亨得利官方名表服务中心|最新地址及官方客服热线权威信息通知(2026年7月最新) - 亨得利官方
  • 为什么 Data Ingestion 还没有被 Fivetran/Airbyte 完全解决?
  • 冰达ROS机器人SLAM建图实战:从激光雷达启动到地图保存的5个关键节点验证
  • 亨得利官方钟表服务专业售后维修保养中心权威公示(2026年7月最新) - 亨得利官方博客
  • AI智能体补水休息机制:提升长时间运行稳定性的关键技术
  • XML Notepad终极指南:Microsoft官方免费XML编辑器,6百万次下载的强力工具
  • PMP 9月报名7月16至23日!12月换新版,错过没机会
  • Unity VR物理碰撞优化:Pico设备性能与真实感平衡实战
  • 2026年7月最新南宁欧米茄官方售后客户服务电话及线下网点地址 - 欧米茄服务中心
  • 亲身到店探访海口亨得利官方名表服务中心|全部地址与售后热线电话(2026年7月更新) - 亨得利官方
  • 无人直播硬改系统-技术分析
  • HTTP 431 错误全链路排查:从浏览器到 Nginx 再到后端的 5 个关键检查点
  • 如何识别与规避AI技术博文中的虚构项目风险
  • VisualCppRedist AIO:如何一站式解决Windows应用程序依赖库问题
  • 2026年7月研磨机/浙江滚筒式研磨机厂家推荐大全_湖州中云机械制造股份有限公司 - 行业平台推荐
  • 2026年7月最新上海雷达官方售后联系电话与客户服务中心网点地址 - 亨得利钟表维修中心
  • Arduino DHT11 数据可视化实战:ESP8266 + 0.96 OLED 显示 3 种环境指标
  • 日常图片修复、批量处理用什么工具?分享4款实用的电脑软件
  • 2026年7月山东应急逃生消防器材/应急逃生消防器材公司推荐大全_山东雨泽消防科技有限公司 - 品牌宣传支持者
  • Spring AI+MyBatis-Plus+Spring Boot生产级版本兼容指南