浏览器中的页面循环系统

news2024/11/18 23:38:12

【】渲染进程中有个主线程处理安排好的任务,为了在线程运行过程中接收并处理新任务,引入了事件循环机制;为了处理其他线程发送来的任务,引入消息队列;为了处理其他进程发送来的任务,渲染进程专门有一个IO线程来接收其他进程传进来的信息
请添加图片描述

【】通常我们把消息队列中的任务称为宏任务,每个宏任务中都包含一个微任务队列,在执行宏任务的过程中,如果DOM有变化,那么就会将该变化添加到微任务列表中。等宏任务中的主要功能都执行完成后,渲染引擎并不着急去执行下一个宏任务,而是执行当前宏任务中的微任务

【】通过 setTimeout 来介绍事件循环的应用。为了保证回调函数在指定时间内执行,不能将定时器的回调函数直接添加到消息队列中,在 chrome 中除了正常使用的消息队列外,还有另外一个消息队列,这个队列中维护了延迟执行的任务列表,包括定时器和内部一些其他的延迟执行的任务,所以当js创建一个定时器时,渲染进程会将该定时器的回调任务添加到延迟队列中。注意,延迟队列其实是hsahmap结构

【】在来看看 XMLHttpRequest 运行机制
请添加图片描述

【】现代浏览器里,产生微任务有两种方式:第一种方式是使用 MutationObserver 监控某个 DOM 节点,然后再通过 JavaScript 来修改这个节点,或者为这个节点添加、删除部分子节点,当 DOM 节点发生变化时,就会产生 DOM 变化记录的微任务。第二种方式是使用 Promise,当调用 Promise.resolve() 或者 Promise.reject() 的时候,也会产生微任务。

【】先执行宏任务在执行微任务,在执行宏任务中会分同步任务和异步任务,先执行同步任务,异步任务又分宏任务和微任务,宏任务放到消息队列中,微任务全部执行完,在通过事件循环机制拿到下个宏任务。在渲染进程内会维护多个消息队列,每次事件循环机制会拿到最老的事件去执行,每次执行宏任务时都会创建对应的微任务

【】Promise 实例有三种状态:pending、fulfilled、rejected,一旦状态改变,就不会再变。Promise.prototype上有三种方法:then()、catch()、finally()。Promise实例创建后,执行器里的逻辑会立即执行。Promise还有很多方法:Promise.all()、Promise.race()、Promise.allSettled()、Promise.any()。Promise本来是用于解决回调地狱的问题,借助.then 返回一个Promise,使用链式调用:

getData1().then(res=>{
  console.log(res)  // data1
  return getData2();
}).then(res=>{
  console.log(res) // data2
  return getData3();
}).then(res=>{
  console.log(res) // data3
})

【】生成器(Generator)是 ES6 提供的一种异步编程解决方案,主要原因是它可以在执行中被中断( yield )、然后等待一段时间再被我们唤醒( next() )。它的底层实现机制——协程,协程是一种比线程更加轻量级的存在

function* genDemo() {
    console.log("开始执行第一段")
    yield 'generator 2'

    console.log("开始执行第二段")
    yield 'generator 2'

    console.log("开始执行第三段")
    yield 'generator 2'

    console.log("执行结束")
    return 'generator 2'
}

console.log('main 0')
let gen = genDemo()
console.log(gen.next().value)
console.log('main 1')
console.log(gen.next().value)
console.log('main 2')
console.log(gen.next().value)
console.log('main 3')
console.log(gen.next().value)
console.log('main 4')

请添加图片描述

【】ES7 引入了 async/await,这是 JavaScript 异步编程的一个重大改进,提供了在不阻塞主线程的情况下使用同步代码实现异步访问资源的能力,并且使得代码逻辑更加清晰。async 函数是异步执行和隐式返回 Promise,await会默认创建一个 Promise 对象,而 await 后面的代码需要在它执行完后在执行

async function foo() {
    console.log(1)
    let a = await 100
    console.log(a)
    console.log(2)
}
console.log(0)
foo()
console.log(3)

请添加图片描述



参考资料:浏览器工作原理与实践

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

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

相关文章

【数据结构初阶】二、顺序表的实现

目录 一、线性表 二、顺序表 2.1 顺序表概念及结构 2.2 顺序表接口实现 2.2.1 顺序表初始化 2.2.2 顺序表的销毁 2.2.3 顺序表的打印 2.2.4 顺序表增加数据(插入,头插、尾插) 2.2.5 顺序表删除数据(删除,头删…

Uniapp集成腾讯IM+音视频通话

腾讯IM(包含界面)源码下载相关配置 传送门:https://cloud.tencent.com/document/product/269/36887 传送门:https://github.com/TencentCloud/TIMSDK/tree/master/uni-app vue2 vue3都可 笔者用的vue2 解压文件 拖到编辑器 #项目右键 在命令行窗口打开 …

Promethues原理详解

目录 引言 一、Prometheus概念 1.1、什么是Prometheus 1.2、Zabbix和Prometheus区别 1.3、Prometheus的特点 二、运维监控平台设计思路 三、Prometheus监控体系 3.1、系统层监控(需要监控的数据) 3.2、中间件及基础设施类监控 3.3、应用层监控…

语音合成经典模型结构介绍

(以下内容搬运自 PaddleSpeech) Models introduction TTS system mainly includes three modules: Text Frontend, Acoustic model and Vocoder. We introduce a rule-based Chinese text frontend in cn_text_frontend.md. Here, we will introduce acoustic models and voc…

XDataverse免费的统一数据库管理工具

XDataverse产品简介 XDataverse是一款通用的数据库管理工具,主要管理关系型数据库,同时也支持一些其余类型的数据库,比如Redis。其主要功能有 支持主流关系型数据库的常规操作,比如MySQL,SQLServer,SQlite,SQLCE,Postg…

机器学习 逻辑回归(2)softmax回归多类别分类-鸢尾花案例

机器学习 逻辑回归之softmax回归多类别分类-鸢尾花案例一、前言二、假设函数三、One-Hot 独热编码四、代价函数五、梯度下降六、原生代码实现6.1 加载并查看数据6.2 添加前置与数据分割6.3 迭代训练6.4 验证数据七、sklearn代码实现八、参考资料PS:softmax回归损失函…

[时间序列预测]基于BP、LSTM、CNN-LSTM神经网络算法的单特征用电负荷预测[保姆级手把手教学]

系列文章目录 深度学习原理-----线性回归梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络 深度学习原理-----卷积神经网络 深度学习原理-----循环神经网络(RNN、LSTM) 时间序列预测-----基于BP、LSTM、CNN-LSTM神经网络…

安卓开发Android studio学习笔记14:用户注册登录(案例演示)

Android studio学习笔记第一步:配置activity_information.xml第二步:配置activity_registration.xml第三步:配置strings.xml第四步:配置InformationActivity第五步:配置RegistrationActivity第六步:运行结果…

二叉搜索树

文章目录二叉搜索树1. 概念2. 模拟实现二叉搜索树2.1 准备工作 创建类2.2 查找方法2.3 插入方法2.4 删除方法3. 性能分析二叉搜索树 前言 : 1. 概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不…

学点高端技术:基于密度的聚类算法——FDBSCAN算法

机器学习、人工智能各类KNN算法层出不穷,DBSCAN具有强代表性,它是一个基于密度的聚类算法,最大的优点是能够把高密度区域划分为簇,能够在高噪声的条件下实现对目标的精准识别,但该算法当前已远不能满足人们对于高效率、…

零基础自学javase黑马课程第二天

零基础自学javase黑马课程第二天 ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csdn首发! 😘系列专栏:java学习 💻首发时间:🎞2022年10月16日&#…

【电子技术基础(精华版)】直流稳压电路

前期我们了解了一些关于直流稳压电源的基础知识,为了更好地完善职教高考电子技术专业的需求,接下来我会更新【电子技术基础(精华版)】,从中可以让更多的职教高考生有效地复习。 由于本人是山东省的一位博主&#xff0…

3、SySeVR测试(上)

一、准备 1、将测试代码放在/home/test目录下; 2、将测试数据导入joern 在/home/SySeVR/joern-0.3.1查看是否存在.joernIndex文件,有的话,需要删除。 删除之后,将测试数据导入joern: java -jar /home/SySeVR/joern-0.3.1/bin/jo…

程序员的中年危机:那些能工作到45、50、60的程序员们,究竟具备了哪些能力?

程序员行业新技术发展迅猛,可以说是日新月异。也正是这个原因,中年危机成为我们必须面对和攻克的问题。 思考一个问题:那些能工作到45、50、甚至60的程序员们,究竟具备了哪些过人的能力? 就我过去的经历和观察来说&a…

A comprehensive overview of knowledge graph completion

摘要 知识图(KG)以其代表和管理海量知识的独特优势,为各种下游知识感知任务(如推荐和智能问答)提供了高质量的结构化知识。KGs的质量和完整性在很大程度上决定了下游任务的有效性。但由于知识产权制度的不完备性,知识产权制度中仍有大量有价值的知识缺失…

【《机器人技术》复习】

【《机器人技术》复习】1. 要求:2. 机械手运动解算问题2.1 自由度考点2.2 运动学方程2.3 动力学方程2.4 传感器2.5 编程题1. 要求: 本次大作业上交截止时间 之前,超时,本门课程判定不及格。 作业上交的格式如下 一律以 WORD 文档…

2022年江西省职业院校技能大赛“网络空间安全”比赛任务书

2022年江西省职业院校技能大赛“网络空间安全” 比赛任务书 一、竞赛时间 总计:360分钟 竞赛阶段竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略配置 A-3 流量完整性保护 A-4 事件监控 A-5 …

求交叉链表头结点-面试必备

这里分享一下一个交叉链表的关键题目,觉得不错的小伙伴别忘了点赞支持 交叉链表无环链表思路代码有环链表思路代码总结无环链表 已知有两个链表(无环)相交,求出相交的头结点 思路 因为链表相交,所以最后一部分一定重…

每天五分钟机器学习:常用的参数寻优方法——k折交叉验证

本文重点 本文我们介绍一种常用的参数寻优方法--k折交叉验证,现在的数据集一般分为三类,分别为训练集,验证集,测试集。训练集用于训练模型,验证集用于调参,测试集用于测试调参之后的模型效果。 但是很多时…

SpringBoot+Vue实现前后端分离社区疫苗接种管理系统

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JDK版…