js事件循环机制(宏微任务队列都是先进先出)

news2024/11/16 0:18:50

文章目录

    • 1.什么是事件循环
    • 2.主线程、任务队列、同步任务、异步任务、微任务、宏任务
      • (1)主线程
      • (2)同步任务
      • (3)异步任务(微任务、宏任务)
      • (4)任务队列
    • 3.执行流程图
      • (1)整体流程图
      • (2)含子任务流程图
    • 4.面试题
      • (1)定时器与promise
      • (2)定时器与promise
      • (3)定时器与promise
      • (4)await后面的任务变成了微任务

1.什么是事件循环

事件循环(Event Loop)是单线程的JavaScript在处理异步事件时进行的一种循环过程,具体来讲,对于异步事件它会先加入到任务队列中挂起,等主线程空闲时会去执行任务队列(Event Queue)中的事件。如此反复循环。事件循环的设计使得 JavaScript 可以在单线程下处理异步操作,避免了阻塞的情况,保证了程序的响应性和流畅性。

简单一句话:

主线程、任务队列、同步任务、异步任务、微任务、宏任务
主线程先执行同步任务,然后才去执行任务队列里的任务,如果在执行宏任务之前有微任务,那么要先执行微任务全部执行完之后等待主线程的调用,调用完之后再去任务队列中查看是否有异步任务,这样一个循环往复的过程就是事件循环!

2.主线程、任务队列、同步任务、异步任务、微任务、宏任务

(1)主线程

JavaScript是单线程的,‌这意味着JavaScript代码在浏览器中只能按顺序执行,‌无法同时执行多个任务。‌这种设计选择主要是出于简化编程模型和避免复杂的多线程同步问题的考虑。‌尽管JavaScript引擎内部可能包含多个线程,‌但这些线程主要用于后台处理,‌如垃圾回收等,‌而主线程(‌即执行JavaScript代码的线程)‌始终保持单线程模式。‌这种设计使得JavaScript在处理用户交互和页面渲染时能够保持一致的状态,‌避免了多线程环境中可能出现的竞态条件和同步问题。‌

JavaScript的单线程特性意味着它在一个时间点只能执行一个任务。‌当JavaScript代码运行时,‌如果遇到阻塞操作(‌如等待用户输入或长时间的计算)‌,‌则会暂停当前任务的执行,‌直到该操作完成。‌这种特性有时会导致页面响应不够流畅,‌尤其是在执行复杂计算或等待网络请求时。‌然而,‌通过使用异步编程技术(‌如回调函数、‌Promises或async/await)‌,‌开发者可以有效地管理这些阻塞操作,‌提高用户体验。‌

此外,‌JavaScript的任务执行模型还包括一个消息队列,‌用于存放待执行的任务。‌当主线程空闲时,‌会从队列中取出任务并执行。‌这种模型允许JavaScript以非阻塞的方式处理异步事件,‌如定时器触发、‌用户交互等,‌从而实现了在单线程环境中模拟多任务处理的效果

(2)同步任务

同步任务是那些在主线程上排队等待执行的任务,只有前一个任务执行完毕,才能执行后一个任务。

(3)异步任务(微任务、宏任务)

异步任务又分为微任务和宏任务,一般等主线程的听不任务执行完毕后,任务队列中的微任务优先进入主线程执行。

宏任务有哪些

类型有哪些
宏任务定时器
宏任务事件绑定
宏任务ajax
宏任务回调函数
宏任务定时器Node中fs可以进行异步的I/O操作

微任务有哪些

类型有哪些
微任务Promise
微任务process.nextTick
微任务MutationObserver

(4)任务队列

JavaScript中的任务队列是一种用于存放将要执行的异步任务

3.执行流程图

(1)整体流程图

请添加图片描述

(2)含子任务流程图

请添加图片描述

4.面试题

(1)定时器与promise

		setTimeout(() => {
            console.log(1);
        }, 0);
        const promise = new Promise((resolve, reject) => {
            console.log(2);
            resolve()
        })
        promise.then(() => {
             console.log(3); 
        })
        console.log(4);
        // 1.先执行同步任务,new Promise的时候会立即执行一次,
        // console.log(2);跟console.log(4);同为同步任务,输出2,4
        // 2.同步任务执行完,执行异步任务,异步任务分为微任务和宏任务
        // promise是为任务先执行,定时器是宏任务后执行。输出3,1
        // 3.结果2,4,3,1

(2)定时器与promise

 		console.log(8);
        function workFun(a) {
            console.log(6);
            if (a) {
                console.log(10);
            }
            return new Promise((resolve, reject) => {
                console.log(7);
                resolve()
            })
        }
        setTimeout(() => {
            console.log(1);
            setTimeout(() => {
                console.log(3);
            }, 0)
            workFun('a').then(res => {
                console.log(5);
            })
        }, 0)
        workFun().then(res => {
            console.log(4);
        })
        console.log(2)
        // 1.先执行同步任务console.log(8);。输出8
        // 2.workFun().then,中workFun()是同步任务,执行输出6,7
        // 3。console.log(2)是同步任务输出2
        // 4.执行异步的微任务workFun().then()。输出4
        // 5.执行异步的宏任务。输出1,6,10,7,5,3

(3)定时器与promise

 async function method() {
            await method2();
            console.log(1)
        }

        function method2() {
            const promise = new Promise((resolve) => { setTimeout(() => resolve(), 0) });
            return promise;
        }

        function main() {
            method()
            console.log(2)
        }

        main()

        // 1.执行main,main中methods是异步函数放入任务队列,输出2
        // 2.执行method,method2是异步函数,输出1,
        // 结果就是2,1

(4)await后面的任务变成了微任务

console.log("开始");
        async function myAwait() {
            
            let a = await fn();
            console.log("微队列中1");
            console.log('微队列中2');
        }
        myAwait();
        function fn() {
            return new Promise((resolve, reject) => {
                console.log(123);
                resolve()
            })
        }
        console.log("结束");
        // 1.输出同步任务,输出,开始、执行myAwait的时候new了一个promise立即执行输出123,在输出结束
        // 2.这里为什么没有输出console.log("微队列中1");console.log('微队列中2');这两个是因为在await后面,需要等待外层的任务执行完了,在执行await后面的同步任务宏任务微任务,分别加入宏任务微任务栈

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

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

相关文章

乔布斯对产品,团队,人才的理解

乔布斯的设计理念和管理理念是他领导Apple取得成功的核心因素。以下是对他在产品设计和团队管理方面理念的详细描述 乔布斯的设计理念 1. 简约主义 简洁与直观:乔布斯强调设计的简约性。他相信产品应该尽可能简单且易于使用,去除一切不必要的复杂性。例如…

AIoT新技术融合基础设计课程开发与运营案例分析

本文来自下面的论文的第4部分:《Research on Basic Engineering Design Course Development and Application of New Technology AIoT (Artificial Intelligence of Things) Convergence Education》,作者是Yunja Hwang,来自韩国檀国大学工学…

IDEA左下角不显示本地修改的localChanges信息-git

IDEA左下角不显示本地修改的localChanges信息-git 取消勾选这个

【RTT-Studio】详细使用教程十:TM1638驱动数码管

文章目录 一、简介二、TM1638地址组三、TM1638的两种数码管使用方式四、TM1638数据格式五、按键扫描和键扫复用六、完整代码 一、简介 TM1638是深圳市天微电子有限公司设计的一款带键盘扫描接口的LED(发光二极管显示器)驱动控制专用芯片,内部…

React18+Vite+Eectron从入门到实战系列之一环境安装篇

如果我们的技术栈是react,也想要用electron来开发一个桌面的多端应用该怎么做呢?这篇文章选择了react的技术栈,讲解了环境的初始化步骤 实现效果 步骤 创建 react 项目 npm create vitelatest my-react-app安装依赖 cd my-react-app npm i…

勒索软件、供应链攻击等带来的思考!

2023年勒索软件、供应链攻击、地缘政治冲突与黑客活动主义、国家黑客间谍与APT组织活动成为网络安全的热点话题,生成式人工智能技术的武器化更是给动荡的全球网络安全威胁态势增加了不确定性、不对称性和复杂性。 即将到来的2024年,随着网络犯罪的规模化…

基于卷积神经网络ResUnet 多模态融合实验、BraTS 3d数据集(nii.gz)4模态融合分割

1、前言 之前介绍了unet对BraTS 3d数据集的2d图片分割,实现思路如下: 1、对BraTS 3d数据集进行切片,沿着某个模态的横断面切割 2、划分数据集、包括训练集、验证集等等 3、网络训练 4、评估模型性能等等 具体的可以参考本文:…

黑丝或者白丝,都可以用LoRA(Stable Diffusion进阶篇:ComfyUI 附加网络)

前言 在学习WebUI的那些基础知识点的时候,有一个东西是每一个初学者都绕不开的大山-附加网络。 这个东西对于每一个接触Stable Diffusion的小伙伴来说就像是小学门口小卖部卖的辣条、初中课本上的涂鸦、高中数学卷解不开的最后一道大题。 学习过WebUI里Stable Di…

基础岛 - 8G显存验证书生·浦语大模型的Demo

因为以前用过LMDeploy,所以本章的内容相对熟悉。 另外,因为教程写的很详细保姆级,所以大多数情况直接复制执行命令即可。开发机的创建略过。 总体验证结论: LMDeploy的模型加载有点慢,但推理速度快,符合预…

将tsx引入vue

按钮 vue <cl-batch-btn >新增批量</cl-batch-btn> import batch from "//modules/ad/components/ uploading/batch.vue" import ClBatchBtn from "/~/crud/src/components/batch-btn"; tsx

从困境到突破,EasyMR 集群迁移助力大数据底座信创国产化

在大数据时代&#xff0c;企业对数据的依赖程度越来越高。然而&#xff0c;随着业务的不断发展和技术的快速迭代&#xff0c;大数据平台的集群迁移已成为企业数据中台发展途中无法回避的需求。在大数据平台发展初期&#xff0c;国内数据中台市场主要以国外开源 CDH、商业化 CDP…

JVM(十二)细谈JVM类加载的各个过程以及如何修改Java原生API

本文深入探讨了Java虚拟机&#xff08;JVM&#xff09;的类加载机制&#xff0c;包括类的加载、验证、准备、解析和初始化等过程。文章首先通过几个高级面试问题引入主题&#xff0c;然后详细解释了JVM类加载的五个阶段及其重要性。接着&#xff0c;介绍了Java的三个主要类加载…

普通话测试前如何抱佛脚拿高分

全国普通话水平测试对很多大学生而言是最好拿证的考试&#xff0c;当然了对于某些专业的考生也会有更高的拿证要求&#xff0c;例如对于需要考教师资格证的同学而言。希望这篇文章可以帮助到各位考生在普通话水平测试中取得高分。 首先我们需要知道考试考什么 一、测试内容 …

M.2接口

接口分类 key-a key-b key-e key-m接口图片

图吧工具箱:硬件检测的一站式解决方案,好用到让同行都点赞!

前言 嘿&#xff0c;各位硬件迷们&#xff0c;小江湖又来啦&#xff01;今天&#xff0c;我手里可是攥着个宝贝&#xff0c;一个能让你们眼前一亮的神秘工具箱&#xff1b;别急着问是啥&#xff0c;我先卖个关子&#xff0c;就说这工具箱啊&#xff0c;简直是硬件界的“八卦炉”…

8.C基础_指针基础

指针概述 指针存放的都是首地址。 1、定义与初始化 形式&#xff1a;<数据类型>* <变量名> <地址>; int a 10; int *p &a; 指针的类型不同&#xff0c;p时的偏移地址量不同&#xff0c;偏移地址 sizeof(类型)Byte 注意点&#xff1a; 指针的…

LMS4124R-13000S01激光测距仪使用方法【sick LMS4124R-13000S01】

1、下载SOPAS&#xff1a; 点击下载SOPAS 1 SOPAS 自动搜索设备 正常上电及网络连接&#xff0c;打开 SOPAS 自动搜索到 LMS41XXX&#xff0c;并且可以看到其版本号&#xff0c; SN,IP 信息&#xff0c;产品默认 IP 为 192.168.0.1. 2 搜索设备 鼠标双击“LMS41XXX(SN 18460…

15.DMDIS 工具优化

文章目录 前言一、安装部署安装数据源转换作业监控 二、性能优化问题 1 &#xff1a;DMETL 卡顿问题问题 2 &#xff1a;DM -> HIVE 的迁移速度慢问题 3 &#xff1a;ORACLE -> DM 的迁移速度慢问题 4 &#xff1a;GP -> DM 的迁移速度慢问题 5 &#xff1a;DM -> …

AI芯片成本压力影响利润

Supermicro&#xff08;SMCI&#xff09;近日公布的季度业绩低于预期&#xff0c;主要因其生产的最新人工智能&#xff08;AI&#xff09;芯片服务器成本高企&#xff0c;导致经调整后的毛利率未能达到分析师的预期水平。这一消息使得其股价在盘后交易中急剧下跌14%&#xff0c…

江科大/江协科技 STM32学习笔记P19

文章目录 TIM编码器接口编码器接口简介正交编码器编码器接口电路、基本结构工作模式 TIM编码器接口 改写旋转编码器计次程序&#xff0c;通过定时器的编码器接口自动计次&#xff0c;与之前触发外部中断手动计次相比&#xff0c;节约软件资源&#xff0c;当有电机高速旋转时&a…