尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

浏览器事件循环(Event Loop)

浏览器事件循环(Event Loop)
📅 发布时间:2026/7/11 3:35:52

彻底搞懂!

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

在 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

相关新闻

  • 西部数据移动硬盘驱动下载 详细安装步骤教程
  • 为什么 Data Ingestion 还没有被 Fivetran/Airbyte 完全解决?
  • 亨得利官方钟表服务专业售后维修保养中心权威公示(2026年7月最新) - 亨得利官方博客

最新新闻

  • 测试时计算:动态优化大模型推理效率与成本的关键策略
  • 劳力士中国官方售后服务中心|地址及官方客服热线权威信息通知(2026年7月更新) - 劳力士服务中心
  • 亨得利官方名表服务中心|全新官方地址及客服热线权威信息公告(2026年7月最新) - 亨得利官方博客
  • Claude 中转站在运营团队里的价值:不仅是写文案那么简单
  • 数字孪生到底能解决什么实际问题?:竞争格局与落地机遇
  • ceph集群搭建

日新闻

  • OpenClaw本地部署:一键直连微信的私有化AI Agent实战指南
  • Kubernetes 系列【10】控制器:ReplicaSet(副本集)
  • 怎么寄快递才能便宜呢?2026年7月寄快递省钱攻略 - 生活情报姬

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号