事件轮询EventLoop

news2024/11/19 8:34:58

 

JS 是一门单线程语言 (换句话说: 一个时间内我只能做一件事), 异步操作都是放到事件循环队列中, 等待主执行栈来执行
JS 是如何执行的 (执行顺序)
●从上往下, 一行一行执行
●如果中间的某一行书写有误, 那么程序在运行到这一行会报错并停止向下继续运行
●先把所有的同步代码执行完毕, 然后再开始执行异步代码
EventLoop 是什么
其实就是一种执行方式, 当主线程的任务执行完毕后, 会通过轮询, 轮询事件队列(也有人叫做回调队列)当中的任务的方式去执行任务, 如果事件队列中的任务为空, 会一直轮询, 通过事件轮询推入主线程
EventLoop 的规则是什么
● 从宏任务开始
●每执行完毕一个宏任务, 就会清空一次微任务队列(不管微任务队列有多少任务, 都执行完毕)
●然后再次执行一个宏任务
●循环往复, 直到所有任务队列全都清空
宏任务宇微任务是什么
●在 JS 中, 代码分为了两种, 同步和异步
●异步任务中也分为了两种, 宏任务与微任务
○宏任务: 'script 整体代码, setTimeout, setInterval 等...'
○微任务: 'Promise.then(), process.nextTick(NodeJs), MutationObserver(H5新特性)...'

文章底部扫码,免费领取前端资料大礼包!
案例分析


console.log(1)

setTimeout(() => console.log(2), 0)

Promise.resolve().then(() => console.log(3))

console.log(4)


复制代码

●具体流程
1.根据 EventLoop 的规则, 从宏任务开始, 因为 script 就算一个宏任务, 所以此时会先将它内部的所有 同步代码执行完毕
a. 代码从上往下执行, 在第一行遇到了一个 console.log(1), 属于同步代码, 直接执行 (打印1)
b.向下执行中, 遇到一个 setTimeout 推入到 宏任务队列
c.向下继续执行, 遇到一个 promise.then(), 推入到微任务队列
d.最后遇到了一个 console.log(4), 属于同步代码, 直接打印 (打印4)
2. 根据 EventLoop 的规则, 此时执行完毕一个 宏任务, 那么会清空微任务队列
a.微任务队列中只有一个 promise.then, 内部的代码为 console.log(3)
b.所以清空完毕微任务队列后, 控制台多了一个 打印 3
3. 根据 EventLoop 的规则, 此时会继续执行下一个宏任务
a.目前宏任务队列中的任务为 setTimeout, 内部的代码为 console.log(2)
b.所以执行完 当前宏任务后, 控制台多了一个 打印 2
4. 根据 EventLoop 的规则, 此时会清空微任务队列, 但是此时微任务内没有任何任务
5. 根据 EventLoop 的规则, 此时会查看宏任务队列, 但是此时宏任务内也没有任何任务
6. 程序到此已全都执行完毕
7. 最终的打印结果: '1, 4, 3, 2'
如果在宏任务执行过程中又开启了一个微任务如何执行?
●代码


console.log(1)

setTimeout(() => {
  console.log(2)
  Promise.resolve().then(() => {
    console.log(3)
  })
})

new Promise((resolve, reject) => {
  console.log(4)
  resolve(5)
}).then((data) => {
  console.log(data);
  return 6;
}).then((data)=>{
  console.log(data)
})

setTimeout(() => {
  console.log(7);
})

console.log(8);


复制代码

文章底部扫码,免费领取前端资料大礼包!

● 执行流程
一、执行 script 中的所有代码
1、console.log(1); 同步任务 直接打印
2、setTimerout; 异步任务, 推入宏任务队列
3、new Promise 中的代码属于同步任务, 但是 后续的 then 属于异步任务; 所以会执行 console.log(4); 并推入 then 到微任务队列
4、setTimerout; 异步任务, 推入宏任务队列 (在此之前已经有一个了)
5、console.log(8); 同步任务直接打印
6、此时控制台打印: '1, 4, 8'
二、根据规则, 此时执行完毕一个宏任务, 所以会去清空微任务队列中的任务
1、此时微任务队列中的是 之前的 promise 的 then 方法, 因为 promise中 resolve的值为 5, 所以此时打印的值是 5
2、这个 then 方法执行完毕会 return 一个 6, 所以后续的 then 方法会继续执行, 所以打印的是 6
3、此时控制台打印: '5, 6'
三、根据规则, 此时会微任务队列已清空, 所以会执行下一个宏任务
1、此时会执行第一个 setTimetou
2、内部代码第一个为 console.log(2), 所以会直接打印
3、后续的代码为一段 promise, 注意: "此时会将这个promise推入微任务队列中"
4、此时控制台打印: '2'
四、执行完毕一个宏任务后, 再次清空微任务队列
1、此时就只有第三步中的 promise 这一个微任务了
2、这个微任务执行时会打印 3
3、此时控制台打印: '3'
五、微任务队列清空完毕后继续执行宏任务
1、此时就只剩下最后一个 setTimeout 了
2、执行内容为 console.log(7)
3、此时控制台打印: '7'
六、最终的打印结果: '1, 4, 8, 5, 6, 2, 3, 7'

如果上面的文章看着比较枯燥,点击下面的链接直接观看:
千锋教育JavaScript全套视频教程(10天学会Js,前端javascript入门必备)

也可以扫码直接观看视频哦!绝对的干货满满,更多精彩视频B站搜索“千锋教育” 

 

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

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

相关文章

15个对Web开发人员有用工具网站

1. 代码转图片 网址:https://carbon.now.sh/ 使用 Carbon 创建和分享源代码的精美图像。它提供了多种代码风格和主题。 3.图片图库 网址:https://unsplash.com/ 4. 智能 WebP、PNG 和 JPEG 图片压缩 网址:https://tinypng.com/ tiny…

SpringCloud00

服务调用方式 RPC和HTTP 无论是微服务还是SOA,都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下2种: RPC:Remote Produce Call远程过程调用,类似的还有 。自定义数据格式&am…

VSAN 7 安装部署指南(一)

本文使用三台服务器安装ESXI 7.0 ,并在其中一台ESXI中安装vCenter 7.0。本环境中最终在VMware Workstation虚拟机中做的嵌套虚拟化。每台虚拟机配置两块网卡,一块网卡桥接,一块NAT。三块硬盘,一块100GB作为系统盘,一块…

C++前序遍历(栈)

#include <stdio.h> #include <malloc.h> //树结构 typedef struct kl { int data; struct kl *lchild; struct kl *rchild; }bittree; //栈结构 typedef struct ji { int top; bittree **data; int size; }stack; //初始化栈 void in…

【PCIE体系结构十】链路两端的参考时钟有频偏怎么办?

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考书籍&#xff1a;《PCI.EXPRESS系统体系结构标准教材 Mindshare》 PCIE规范中…

Linux环境基础开发工具

目录 Linux软件包管理器yum Linux开发工具 文本编辑器vi、vim vim的基本概念 vim操作 Linux编译器-gcc\g使用 函数库分为动态库和静态库 Linux调试器gdb使用 在gdb模式下的命令 Linux软件包管理器yum yum怎么说呢&#xff1f;就相当我们手机里的应用商店。我们需要安…

RAID磁盘阵列(看咱这篇就够了!)

目录 一、RAID简介 二、RAID的级别详列 三、总结 前言&#xff1a; 写这篇博客的原因是小编在工作中遇到的这个不熟悉的硬件知识&#xff0c;然后工作之余就立马搜集了资料进行学习。了解了RAID的作用和区别以及如何进行挂载之类的。本篇以及之后的一篇博客适合新手小白来初…

8.防火墙

文章目录 防火墙iptables防火墙介绍基础操作高级操作通用匹配隐含匹配端口匹配&#xff1a;--sport 源端口、--dport 目的端口 TCP标志位匹配&#xff1a;--tcp-flags TCP标志位ICMP类型匹配&#xff1a;--icmp-type ICMP类型 显式匹配多端口匹配IP范围匹配&#xff1a;-m ipra…

FPGA_学习_04_Verilog基础语法和Modelsem仿真

前言&#xff1a;对于以前学过C/C/C#的作者来讲&#xff0c;Verilog的基础语法算是特别简单的。本文主要介绍Verilog的基础语法和Modelsem仿真。 Verilog的基础语法 1 模块声明 FPGA开发是以模块为基础的&#xff0c;每个可综合的.v文件都是一个模块&#xff0c;模块由module…

华为云——代码托管的使用

一、打开前后端项目 登录华为云&#xff0c;点击页面右上角的用户名——点击个人设置 2.点击代码托管的HTTPS密码管理&#xff0c;设置自己的密码 3.回到代码仓库&#xff0c;复制HTTP地址 4.打开GitHubDesktop&#xff0c;点击左上角进行仓库克隆 &#xff08;我这里已经cl…

Redis 介绍相关知识,常用五大数据结构

1.Redis 介绍相关知识 Redis 是单线程多路 IO 复用技术 多路复用是指使用一个线程来检查多个文件描述符&#xff08;Socket&#xff09;的就绪状态&#xff0c;比如调用select 和 poll 函数&#xff0c;传入多个文件描述符&#xff0c;如果有一个文件描述符就绪&#xff0c;则…

1米挂幅「社交泛娱乐出海作战地图」预定火爆,免费抢领纸质版

移步【融云全球互联网通信云】回复“地图”免费领 家人们&#xff01; 融云自制《社交泛娱乐出海作战地图》 首开大捷&#xff01; 预约已超 300 出海必备实战手册 移步公众号报名 泰火辣~ 已预约进入排队的朋友请耐心等待 后期我们将按照报名顺序依次派送 另外&#…

终于通过啦! 我拿到了阿里云【通义千问】大模型AI测试体验资格啦!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

Jmeter的十大组件

1.Jmeter的十大组件以及执行顺序 1.十大组件 测试计划线程组配置元件前置处理器定时器取样器后置处理器断言监听器 2.执行顺序为从测试计划到监听器依次执行 测试计划> 线程组>配置元件>前置处理器>定时器> 取样器> 后置处理器>断言>监听器 3.作用…

leetcode 2130. Maximum Twin Sum of a Linked List(链表的最大孪生和)

给出一个单向链表&#xff0c;第i 个node 和 第(n-1-i)个node称为twin. 0 < i < n/2 - 1 求所有twin的最大和。 链表长度为偶数。 思路&#xff1a; 链表长度为偶数&#xff0c;就省了不少步骤&#xff0c;不用再考虑奇数时中间那个node单独计算了。 直觉上来看&#x…

Servlet编程---Day 06

一、会话技术概述 &#xff08;一&#xff09;什么是会话技术 类似两个人谈话&#xff0c;会话其实就是服务器和客户端的多次请求和响应 一次会话&#xff1a;多次请求和响应 组成了一次会话。从第一次发送请求建立会话&#xff0c;直到一端断开连接 http协议&#xff1a;…

web前端开发需要哪些技术?学前端顺序千万千万不要搞错啦!

宝子们&#xff0c;下午好&#xff0c;之前给大家分享了前端岗位的前景规划&#xff0c;小源看的出来&#xff0c;还是有不少宝子想入行前端的&#xff01; 那除了会面试&#xff0c;还要有充足丰富的知识储备&#xff0c;需要什么技术&#xff0c;怎么样做才能找到高薪工作呢&…

Oracle Profile详解

Profile的作用主要表现在三个方面 1、密码策略 2、对用户所能使用的资源进行管理 3、profile存放在数据字典里面&#xff0c;默认有一个名字为default的profile set linesize 160 set pagesize 30 select resource_name,resource_type,limit from dba_profiles where profile‘…

Node.js 学习系列(四)—— 回调函数

Node.js 异步编程的直接体现就是回调。 异步编程依托于回调来实现&#xff0c;但不能说使用了回调后程序就异步化了。 回调函数在任务完成后就会被调用&#xff0c;Node 使用了大量的回调函数&#xff0c;Node 的所有 API 都支持回调函数。 例如&#xff0c;我们可以一边读取…

ubuntu22.10 ffmpeg-webrtc推拉流srs环境搭建

一、编译ffmpeg-webrtc 二、openssl&#xff0c;opus&#xff0c;x264配置 三、编译srs 四、测试 4.1推流端 4.2拉流端 五、交互与sdp 最近看到杨大佬发的动态&#xff0c;尝鲜体验一下。 一、编译ffmpeg-webrtc ffmpeg-webrtc官网&#xff1a;https://github.com/ossrs/ffmp…