事件循环-宏任务与微任务

news2025/1/31 1:44:33

事件循环(eventloop)

同步和异步

JS是单线程的,也就是说, 同一时间只能做一件事,所有任务需要排队,前一个任务结束之后才会执行下一个任务。

作为浏览器脚本语言,JavaScript的主要用途是和用户互动以及操作DOM,这决定了它只能是单线程

但我们知道,有些任务是耗时的,会阻塞代码的执行。
为了解决这个问题,我们引出了同步和异步的概念。
可以把代码分为同步代码(同步任务)和异步代码(异步代码)。

异步代码(耗时)同步代码(立即执行)
先放入宿主环境(浏览器/Node) ,不必原地等待结果。(并不阻塞主线程继续往下执行,异步结果在将来执行)立即放入JS 引擎(JS主线程) 执行,并原地等待结果
setTimeout(一次性定时器)如console.log(1)
setInterval(定时器)
Ajax/Fetch 事件绑定
Promise里的then、catch …

执行过程(执行栈宿主环境任务队列):

  1. 同步代码放入执行栈中,异步代码放在宿主环境,等待时机成熟送入任务队列( 如绑定的事件被触发或定时器时间到了,对应回调函数送到任务队列)
  2. 执行栈中代码执行完毕,会去任务队列看是否有异步任务,有就送到执行栈执行,反复循环查看执行,这个过程是事件循环(eventloop)
    在这里插入图片描述

宏任务与微任务

概述

任务分为同步任务和异步任务,异步任务又可以分为宏任务和微任务。

在ES5之后,JavaScript引入了Promise,意味着不需要浏览器,JavaScript引擎自身也能够发起异步任务了。所以,JS可以执行同步和异步任务。

宏任务宿主(浏览器、Node) 发起
微任务JS 引擎发起

宏任务微任务
script(代码块)Promise的then/catch
事件
网络请求(Ajax/Fetch)
setTimeout() 一次性定时器/setlnterva() 定时器

注意:Promise本身是同步的,只有里面then/catch的回调函数是异步的

到现在我们可以把代码整体分为三类:

宏任务的异步代码(宿主环境)微任务的异步代码(js引擎)同步代码(js 执行栈/回调栈)
script(代码块)Promise.then() / catch()
事件Async/Await
网络请求(Ajax/Fetch)process.nextTick (node)
setTimeout() 一次性定时器/setlnterva() 定时器Object.observe 等等
setlmmediate 定时器Object.observe
I/OMutationObserver
Ul render

宏任务、微任务执行过程及顺序

  1. 首先执行放在执行栈中的同步代码
  2. 微任务里的异步代码放在微任务队列排队,根据先进先出原则依次执行
  3. 宏任务里的异步代码放在宏任务队列排队,根据先进先出原则依次执行

具体描述
执行执行栈中所有同步代码,执行完就去微任务队列里面看有没有微任务在进行排队,如果有的话,就将微任务通过事件循环的方式,根据先进先出原则依次推到执行栈中执行。一个微任务执行完之后再回到微任务队列里看还有没有在排队的,有的话就再推到执行栈中执行。所有微任务执行完毕之后,再去看看宏任务队列,重复像刚才的执行过程(看有没有排队的,有的话就按先进先出通过事件循环推到执行栈中执行),宏任务队列中所有任务执行完毕之后,整个代码就执行完毕了。

pink老师:微任务是由JS引擎发起的,离了我们JS更近,所以说会优先执行

在这里插入图片描述

有时候看到说是宏任务优先:
是因为script本身就是一个大的宏任务,我们所有的代码的操作其实是在一个大的宏任务里面去执行的

忽略script:同步任务 --> 微任务 --> 宏任务

每当主线程执行完一个宏任务后,不会立即执行下一个宏任务,而是接着先检查微任务队列。

如果微任务队列中存在待执行的任务,主线程会立即执行微任务,直到微任务队列为空。

因为微任务通常包含那些需要在当前逻辑上下文结束后、但在渲染或执行新的宏任务之前必须完成的操作。

总结

事件循环(eventloop):

不断地检查调用栈是否为空,并且如果任务队列中有待处理的任务,就将它们推入调用栈(执行栈)执行。

  1. JS是单线程,防止代码阻塞,我们把代码(任务):同步和异步

  2. 同步代码给js引擎执行,异步代码交给宿主环境

  3. 同步代码放入执行栈中,异步代码等待时机成熟送入任务队列排队

  4. 执行栈执行完毕,会去任务队列看是否有异步任务,有就送到执行栈执行,反复循环查看执行,这个过程是事件循环(eventloop)

宏任务与微任务

宏任务:
  • 宏任务被添加到宏任务队列中。
  • 事件循环在每个迭代开始时,会检查调用栈是否为空。
  • 如果调用栈为空,事件循环从宏任务队列中取出一个任务,推入调用栈执行。
  • 浏览器在宏任务执行后会进行渲染更新。
微任务:
  • 微任务被添加到微任务队列中。
  • 事件循环在每个迭代中,一旦调用栈清空,就会立即执行微任务队列中的所有微任务。
  • 微任务的执行顺序是先进先出,它们会在当前宏任务完成后、下一个宏任务开始前清空队列。
  • 微任务的优先级高于宏任务,这意味着在执行下一个宏任务之前,所有的微任务都会被处理完毕。
执行过程及顺序:

在这里插入图片描述

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

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

相关文章

jQuery入门(一)jQuery基本语法

一、JQuery介绍 - jQuery 是一个 JavaScript 库。 - 所谓的库,就是一个 JS 文件,里面封装了很多预定义的函数,比如获取元素,执行隐藏、移动等,目的就 是在使用时直接调用,不 需要再重复定义,这…

【linux】【操作系统】内核之asm.s源码阅读

asm.s是Linux内核的一部分,主要负责处理各种类型的硬件异常和中断。 _divide_error 处理除法错误中断。当CPU执行除法指令时遇到除数为零的情况,会触发这个中断。此函数首先保存当前的寄存器状态,然后调用_do_divide_error函数来处理具体的错…

JavaEE 从入门到精通(二) ~SpringMVC 接收请求和设置响应

晚上好,愿这深深的夜色给你带来安宁,让温馨的夜晚抚平你一天的疲惫,美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 一、获取请求数据 1. 简单参数 1.1 请求行获取参数 a. 与查询参数的名称相同,底层会自动映射到形参中。 …

MySQL笔记(二):创建表

一、创建数据库(create) 按行运行,运行后右键rootlocalhost,刷新可以看到变换。 二、查询数据库(show) 三、备份恢复数据库(备份到另一个DBMS中去) 备份数据库(在DOS中执行)命令行 mysqldu…

25款拥有炫酷动画效果的创意404错误页面源代码

25款拥有炫酷动画效果的创意404错误页面源代码,一系列具有炫酷动画效果的创意404错误页面,开发者可以利用各种前端技术和工具来实现。 源码免费下载:https://download.csdn.net/download/m0_66047725/89602634 更多资源下载:关注…

【每日力扣中医养生】力扣55. 跳跃游戏

55. 跳跃游戏 文章目录 【每日力扣】力扣55. 跳跃游戏题目描述输入输出示例示例 1示例 2 思路分析代码实现复杂度分析总结 【每日力扣】力扣55. 跳跃游戏 博主写这篇文章的时候已经凌晨1点30分啦。故想分享一下中医的子午觉这一养生技巧,就算真的要熬夜&#xff0…

第一阶段面试问题(前半部分)

1. 进程和线程的概念、区别以及什么时候用线程、什么时候用进程? (1)线程 线程是CPU任务调度的最小单元、是一个轻量级的进程 (2)进程 进程是操作系统资源分配的最小单元 进程是一个程序动态执行的过程,包…

Scrapy 爬取旅游景点相关数据(八)重用代理

本期学习:代理的使用与代理池的更新 1 代理IP提取 在Scrapy 爬取旅游景点相关数据(六)已经讲到了代理的使用,可以先学习这一期再来看本期内容, 第一步是代理IP提取,下面代码就是在中间件初始化的时候去更…

数据库之mysql初体验

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Nsight-Compute Global Load相关Metric测试

Nsight-Compute Global Load相关Metric测试 1.参考链接2.生成测试用例3.编译4.Profiling并将结果导出到csv文件5.截图 本文使用ptx指令直接从global memory获取数据,了解相关metrics及其计算过程 1.参考链接 PTX Cache OperatorsPTX LD指令Kernel Profiling Guide Caches 2.…

探秘LED显示屏背后的秘密:数字信号与数字电路的奇妙世界

走进繁华的都市,无论是闪烁的霓虹灯下,还是宏大的体育场馆内,LED显示屏以其绚丽的色彩和清晰的画面吸引着我们的目光。但你是否好奇,这些令人惊叹的显示效果背后,隐藏着怎样的科技奥秘?今天,就让…

数据结构初阶-复杂度

复杂度 🎈1.例题一🎈2.例题二 🎈1.例题一 数组nums包含从0到n的所有整数,但其中缺了一个,请编写代码找出那个缺失的整数。 ✅思路1:先冒泡排序,再遍历,当前值1,不等于下一…

Tomato靶机攻略

1、启动靶机 2、通过nmap -sA 192.168.168.0/24得到靶机IP 3、扫描目录 用dirb http://192.168.49.128扫描敏感目录 4、访问敏感目录 5、通过查看源码,发现其存在文件包含漏洞,利用该漏洞查看日志文件 http://192.168.168.131/antibot_image/antibots/…

腾讯云SDK发送短信

腾讯云接口发送短信 (1)创建签名 (2)创建模板 可以自定义模板参数例如:你好{1},这是一个短信 (3)确认套餐包 发送的额度 (4)创建应用 查看应用设置&#…

基于深度学习的植物疾病检测识别系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 农作物病害不仅影响产量,还会导致严重的经济损失。传统的病害检测方法通常依赖人工专家进行目视检查,这种方法费时费力且容易受到主观因素的影响。近年来,深度学…

【Unity】3D功能开发入门系列(一)

Unity3D功能开发入门系列(一) 一、开发环境(一)安装 Unity(二)创建项目(三)Unity 窗口布局 二、场景与视图(一)场景(二)游戏物体&…

R语言统计分析——箱线图

参考资料:R语言实战【第2版】 箱线图(又称盒须图)通过绘制连续型变量的五数总括,即最小值、下四分位数(第25百分位数)、中位数(第50百分位数)、上四分位数(第75百分位数&…

Linux真实机器安装

引言 装机电脑:具有网卡硬件、磁盘空间 > 64G、内存空间 > 4G; 装机工具:rufus,u盘(8G); 装机系统:centos7.iso; 联网工具:路由器,网线 1.…

大学新生如何高效入门编程?全面指南来助力

引言 在当今数字化时代,编程已经成为一项必备技能。无论你未来从事什么职业,编程能力都能为你的职业生涯增添光彩。对于即将步入大学的新生来说,如何高效入门编程是一道关键课题。本文将从如何选择编程语言、制定学习计划、找到顶尖学习资源…