【手写 Promise 源码】第十八篇 - EventLoop 简介

news2024/12/24 20:53:51

theme: fancy

一,前言

近期公司项目比较忙,粘了老博客几篇 Spring 源码来充数,周末腾出时间把 Promise 做个收尾;

在开始 EventLoop 前,我对 Promise 源码部分进行了简单回顾,并更新了【Promise 源码学习】目录 - Promise 知识点梳理;

上一篇,主要介绍了 async/await 的使用和实现原理,主要涉及以下几个点:

  • async/await 的使用和功能分析;
  • async/await 的实现和原理分析;

本篇,继续介绍浏览器的事件环 EventLoop;


二,EventLoop 简介

EventLoop 是一个执行模型,在浏览器和 Node 中均有不同的实现:

  • 在 Node 中,使用 libuv 库实现 EventLoop;
  • 在浏览器中,由 Html 规范定义了 EventLoop;

在 JavaScript 代码执行的过程中,可能会进行发送请求、开启定时器等异步操作;

EventLoop 事件循环主要就负责完成相关任务的调度工作;比如:面试中经常问到的执行顺序问题;

备注:EventLoop 是前端领域的重要知识点,也是前端面试的核心考察点;


三,宏任务和微任务

在浏览器的事件循环 EventLoop 执行模型中,涉及宏任务和微任务;

常见宏任务:

  • JS 执行栈:js在执行时就是一个宏任务;
  • 定时器:setTimeout、setInterval;
  • postMessage、MessageChannel;
  • IE 下的 setImmediate 方法;
  • UI 的界面渲染;
  • 事件;
  • Ajax;

常见微任务:

  • promise.then;
  • mutationObserver;

备注:为了方便记忆,可以简单理解为:除以上两种微任务之外,其余均为宏任务;


四,EventLoop 循环机制

浏览器 EventLoop 图示:

image.png

重要组成部分:

  1. 左边 - JS 执行线程:用于执行 JS;(JS 代码为栈型结构执行)
  2. 右边 - GUI 线程:用于界面的渲染;
  3. 上边 - 宏任务队列:用于存储运行中产生的宏任务;宏任务队列全局只有一个;
  4. 下边 - 微任务队列:用于存储运行中产生的微任务;宏任务队列每次循环产生一个;

备注:EventLoop 事件触发线程负责不停地轮训事件队列,并逐个取出进行处理;

代码的执行过程

  • 代码执行

JS 代码从上到下执行,当执行到函数时,会创建执行上下文放入 JS 执行栈;

JS 代码中将包含同步代码和异步代码两种;

  • 异步操作-宏任务(浏览器 API)

执行过程中,可能发生异步操作(如:定时器、ajax、事件等);

当异步操作的时间到达或成功时,将会被放入到事件队列中;(在事件队列中维护宏任务)

备注:由于队列具有先进先出的特点,因此可以保证代码的执行顺序;

  • 事件循环线程

事件循环线程,用于不停地轮训扫描事件队列;
事件循环线程,将对当前执行栈进行检测:若执行栈为空,将会从件队列中取出一个放入执行

备注:事件循环线程是一个单独的线程,所以并不会阻塞 JS 的执行;

  • 异步操作-微任务( promise )

代码在执行时,还可能产生一些微任务,如 promise;

在微任务中产生的微任务会被放入当前宏任务下的微任务队列中,即会在当前轮次被情况;

备注:每次执行宏任务时,都会单独创建一个微任务队列;

  • GUI 渲染

浏览器渲染的频率是 16.6 ms,所以并不是每次微任务执行完成后都会执行渲染操作;

  • 总结:
    每次循环一次,都会执行一个宏任务,并清空对应的微任务队列;

五,结尾

本篇,主要介绍了 EventLoop 的执行原理,主要涉及以下几个点:

  • EventLoop 简介;
  • 宏任务和微任务;
  • EventLoop 循环机制

下一篇,待定;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【链表面试题】解决环形链表和相交链表问题

在力扣上发现这样的几道题,尝试做了一下,也发现了一个关于这类题的一种做法:快慢指针的使用。废话不多说,上例题 目录 一、环形链表 1.定义(概念) 2.如何判断是否为环形链表 1.快慢指针 2.为什么快指针…

限期出国|CSC资助赴世界top50名校英国曼彻斯特大学访学

我们先为J老师40天获得佐治亚理工学院(美国三大理工学院之一)的访问学者邀请函,又成功申报CSC。后因其担心被美国拒签要求重新申请英国名校,10天后拿到跻身世界top50英国曼彻斯特大学的offer,后经ATAS审批、CSC改派、使…

linux基本功系列-help命令实战

文章目录前言🚀🚀🚀一. help命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示某个命令的帮助信息3.2 查看某个命令的简述3.3 以伪man手册格式输出cd信息四. windows中的help总结前言🚀🚀🚀 想要学好Lin…

车载网络 - Autosar网络管理 - 基本概念

Autosar作为当前车载行业使用最为广泛的一种汽车开发系统架构,网上也有很多相关的介绍;不过我看很多有完整的来讲一下这个规范的,一般都是只讲了其中一部分,我这就准备搞出来一套完整版本的Autosar网络管理的规范、测试设计、自动…

新C++(7):多态那些事儿_下

"当人类悬浮到腐朽,有谁愿追随彗星漂流哦~"一、多态原理(1)虚函数表指针(虚表指针)紧接上一篇sizeof(Base)这一小段说起。class Base1 { public:void func(){} private:int _a; };class Base2 { public:virtual void func() {} private:int _a; };我们知道…

【我刚毕业,学习Java开发工程师能学会吗?没有基础?】

对于Java专业来说,学历还是有一定的要求。一般都是本科学历,至少也有个大专,其次就是年龄越年轻越好。现在转行Java的年轻人很多,学历这方面越高越有竞争力一些,尤其是在后期的职业晋升阶段。如果想走管理路线&#xf…

耗时一周整体,这4款黑科技电脑软件,功能强大到离谱

闲话少说,直上狠货。 1、有道云笔记 有道云这是一款国民级的文稿编辑器,俗话说得好,好记性不如烂笔头,强大实用的笔记软件,能让你的工作与学习事半功倍。5大文稿类型,让记录得心应手,随时进行创…

第十四章 集合(Set)

一、Set 接口(P518) 1. Set接口基本介绍 (1)无序(添加和取出的顺序不一致),没有索引 (2)不允许重复元素,所以最多包含一个 null 2. Set接口的常用方法 和 …

SpringBoot中MQ使用

本文记录学习在Spring Boot中使用MQ。一 什么是MQMQ全称(Message Queue)又名消息队列,是一种异步通讯的中间件。它的作用类似于邮局,发信人(生产者)只需要将信(消息)交给邮局,然后由邮局再将信(消息)发送给具体的接收者…

博途1200PLC/1500PLCMODBUS从站通信应用

博途PLC作为MODBUS主站通信请参看下面的文章链接: 博途PLC 1200/1500PLC MODBUS-RTU通讯优化(状态机编程)_博途plc modbus-rtu通信优化_RXXW_Dor的博客-CSDN博客博途PLC 1200/1500PLC MODBUS-RTU通讯_RXXW_Dor的博客-CSDN博客_博图modbus通讯1、1200PLC的modbus通讯,可以参看…

HTTP协议(1)

1)HTTP协议是倾向于相遇业务层次上面的一种协议,传输层协议主要考虑的是端对端之间的一个传输过程,TCP重点进行关注的是可靠传输;咱们的HTTP/1,HTTP/2是基于TCP的,但是咱们的HTTP/3是基于UDP的,但是当下的互…

实战动态代理

代理模式介绍代理模式有点像老大和小弟,也有点像分销商。主要解决的是问题是为某些资源的访问、对象的类的易用操作上提供方便使用的代理服务。而这种设计思想的模式经常会出现在我们的系统中,或者你用到过的组件中,它们都提供给你一种非常简…

【CVPR 2018】PU-Net: Point Cloud Upsampling Network

文章目录PU-Net: Point Cloud Upsampling Network网络架构训练数据生成点特征嵌入Feature ExpansionCfoordinate Reconstruction端到端训练Joint Loss FunctionPU-Net: Point Cloud Upsampling Network 网络架构 PU-Net有四个组件:patch extraction, point feature…

「自定义类型」C语言中的构造数据类型如结构,联合,枚举

​​​​​​​🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀目录 🐰结构 🏡 前言 🌸数据类型的定义 &…

SpringBoot动态导出word文档(完美实整教程 复制即可使用,不能实现你找我)

背景 最近有一个需求是需要动态导出合同、订单等信息,导出一个word文档供客户进行下载查看。 需要导出的word文件,主要可以分为两种类型。 导出固定内容和图片的word文档导出表格内容不固定的word文档 经过对比工具,我实践过两种实现方式…

一文细说引导内存分配器

一、引导内存分配器 1.引导内存分配器的作用 因为内核里面有很多内存结构体,不可能在静态编译阶段就静态初始化所有的这些内存结构体。另外,在系统启动过程中,系统启动后的物理内存分配器本身也需要初始化,如伙伴分配器&#xff…

OD笔试题-空汽水瓶可以换汽水

/*** 某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水&#xff0c;允许向老板借空汽水瓶&#xff08;但是必须要归还&#xff09;。* 小张手上有n个空汽水瓶&#xff0c;她想知道自己最多可以喝到多少瓶汽水。* 数据范围&#xff1a;输入的正整数满足 1≤n≤100* <p>*…

springboot 多环境配置yml

创建多个配置文件 创建文件时注意&#xff0c;一定是 application-文件名称.yml 这种格式 application.yml #主配置文件 application-dev.yml #开发环境的配置 application-prod.yml #生产环境的配置application-prod.yml # 生产环境端口为90 server:port: 90applica…

Python实现将一段话txt生成字幕srt文件

Python实现将一段话txt生成字幕srt文件 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、为什么要将txt转换成字幕 1.1方便到剪辑软件剪辑 有时获取到一段文本&#xff0c;想要直…

点分治学习笔记

有时候我们会碰到一些树上的路径问题&#xff0c;如果需要处理的规模很大的话&#xff0c;这时候点分治是一个很好的工具&#xff0c;往往可以在O(nlogn)的复杂度内完成操作&#xff0c;一般用于离线处理问题 前置芝士 树的重心&#xff1a;最大子树的值最小的点叫做重心。 …