浅谈js宏观任务、微观任务

2023-11-07

js运行机制分为同步异步,异步又分为宏观事件和微观事件;

同步异步:

js是一门单线程语言,因此js在同一个时间里只能做一件事,单线程意味着,如果在同个时间有多个任务的话,这些任务就需要排队,前一个执行完成才能执行下一个任务。

①同步任务

同步任务是指在主线程上排队执行的任务,只有前一个任务执行完毕,才能继续执行下一个任务

②异步任务

异步任务是指不进去主线程,而进入任务队列的任务,只有任务队列通知主线程,某个异步任务可以执行力,该任务才会进入主线程

在这里插入图片描述

③异步机制

 那么,JavaScript中的异步是怎么实现的呢?那要需要说下回调事件循环这两个概念啦

    首先要先说下任务队列,我们在前面也介绍了,异步任务是不会进入主线程,而是会先进入任务队列,任务队列其实是一个先进先出的数据结构,也是一个事件队列,比如说文件读取操作,因为这是一个异步任务,因此该任务会被添加到任务队列中,等到IO完成后,就会在任务队列中添加一个事件,表示异步任务完成啦,可以进入执行栈啦~但是这时候呀,主线程不一定有空,当主线程处理完其它任务有空时,就会读取任务队列,读取里面有哪些事件,排在前面的事件会被优先进行处理,如果该任务指定了回调函数,那么主线程在处理该事件时,就会执行回调函数中的代码,也就是执行异步任务啦

    单线程从从任务队列中读取任务是不断循环的,每次栈被清空后,都会在任务队列中读取新的任务,如果没有任务,就会等到,直到有新的任务,这就叫做任务循环,因为每个任务都是由一个事件触发的,因此也叫作事件循环

(1)所有同步任务都在主线程上执行,行成一个执行栈
(2)主线程之外,还存在一个任务队列,只要异步任务有了结果,就会在任务队列中放置一个事件
(3)一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,看看里面还有哪些事件,那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行

(4)主线程不断的重复上面的第三步

宏观和微观:

这里里主要讲 JavaScript 语言,那么采纳 JSC 引擎的术语,我们把宿主发起的任务称为宏观任务,把 JavaScript 引擎发起的任务称为微观任务

执行顺序:先同步后异步 先微观再宏观

setTimeOut,Promise 为异步宏观事件

Promise.then() 为异步微观事件

如何分析执行顺序

  1. 首先我们分析有多少个宏任务;
  2. 在每个宏任务中,分析有多少个微任务;
  3. 根据调用次序,确定宏任务中的微任务执行次序;
  4. 根据宏任务的触发规则和调用次序,确定宏任务的执行次序;
  5. 确定整个顺序。

更多详情参考:收藏链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅谈js宏观任务、微观任务 的相关文章

随机推荐

  • pwn新手安装Ubuntu16.0.4踩雷

    为了能够实现更好的打pwn的目的 在大佬的建议下 将pwn环境换成了Ubuntu16 0 4 但是在安装的过程中产生了许多问题 导致重装过不知道多少遍虚拟机 这里写篇记录一下 防止忘记233333 步骤链接 27条消息 Pwn环境配置 三
  • java基础

    1 1 关键字与保留字 关键字 keyword 的定义和特点 gt 定义 被Java语言赋予了特殊含义 用做专门用途的字符串 单词 gt 特点 关键字中所有字母都为小写 gt 官方地址 https docs oracle com javas
  • .NET Core中使用Redis和Memcached的序列化问题

    为什么get set不直接操作对象 而需要序列化 是因为可以提高对数据库操作的执行效率 学习网址https www cnblogs com catcher1994 p 8543711 html
  • Rider 使用

    下载地址 http www jetbrains com rider fromMenu 破解 https www iteblog com archives 1542 html http idea iteblog com key php 使用
  • 约瑟夫环问题(单循环链表实现)

    用单循环链表解决约瑟夫环问题 大致思路 1 利用尾插法建立一个循环链表 建表成功后删除头结点 2 核心算法 生成一个work指针 每走到约定的step 1的位置时停止 利用pdel指针标记后继结点 循环释放pdel 直到work work
  • java数组(二)

    数组 Arrays 数组是一种数据结构 它是一组相同类型的元素的集合 该集合中的每个元素都通过一个索引访问 在Java中 数组是一个对象 它可以存储在堆上或栈上 具体取决于它如何创建 数组可以是单维数组或多维数组 数组是一个固定长度的数据结
  • C++(基础入门笔记)

    1搭建环境 include
  • TCP/IP/UDP/RTP/RTCP协议

    IP 指定目的地址和源地址 Version 版本号 四个字节 IHL IP Header Length IP头长度 Total Length 总的长度 总的长度减去IP头长度 数据长度 Identification Flags Fragme
  • linux OSI七层模型、TCP/IP协议栈及每层结构大揭秘

    学习Linux 就算是像小编我这样的小萌新 也知道OSI模型 什么 你不知道 好吧 这篇秘籍拿走 不谢 一 两个协议 1 OSI 协议模型 7层 国际协议 PDU 协议数据单元对等层次之间传递的数据单位 OSI协议 7层 国际协议 PDU
  • 伺服控制-canopen

    通迅中断参数设 1 中断 停止 伺服驱动 电机停转 开启抱死动作 1 配置 opration 2 设置 3速度模式 3 设置 伺服松轴 4 设置 伺服使能 运行 1 使能 true 2 启用 true 停止 1 使能 false 2 松轴
  • Linux下安装Nginx服务并设置开机自启动

    目录 一 安装Nginx 二 开机自启动服务配置 一 安装Nginx 系统平台 CentOS Linux release 7 9 2009 Core 64位 Nginx安装版本 liunx 64位 nginx 1 20 2 tar gz 安
  • VSCode进行Lua调试

    1 安装EmmyLua 2 添加配置 3 开始调试 要选择要调试的进程就可以了
  • Docker中快速搭建SFTP

    1 拉docker镜像 docker pull atmoz sftp 2 初始化 创建容器 docker run name internalsftp p 22 22 d atmoz sftp anonymous hello123 opt U
  • 震惊~Signal <XXX> missing in the sensitivity list is added for synthesis purposes在verilog中警告的解决方法

    你是否还在为秃头而烦恼 你是否还在通宵为了赶项目而焦急 朋友 你不是 一个人 看看吧 下面是这个bug的描述 WARNING HDLCompiler 91 F FPGA Doc AD test uart v Line 56 Signal
  • java通过JDBC连接mysql8.0数据库,并对数据库中的表进行增删改查操作

    目录 一 JDBC简介 二 添加依赖 三 JDBC操作数据库的步骤 四 JDBC操作数据库 增删改查 一 新增数据 二 删除数据 三 修改数据 四 查询数据 五 多表连接查询 一 JDBC简介 Java数据库连接 Java Database
  • vue-cli配置sass,使用全局sass变量

    vue cli创建vue2 0项目 安装sass步骤 创建vue2 0项目 vue init webpack 项目名 安装sass步骤 npm install node sass 4 14 1 npm install sass loader
  • JMP、Hook

    include stdio h include tchar h include windows h offset 目标地址 jmp指令起始地址 5 跳转指令解码 0xe9 offset offset 有符号整型 四字节 它等于jmp指令的下
  • 微信小程序——仿盒马鲜生APP

    前段时间 随着马化腾现身全国多地用微信小程序乘坐公交的新闻出现 微信小程序的热度可谓是更上了一层 微信小程序现身至今 因其不用下载就可使用的方便等优点 发展趋势一直良好 盒马鲜生的问世也是充满了热度 实现了快速配送 可谓是阿里巴巴对线下超市
  • 科幻风的卡片视频播放

    上一篇博文展示了卡片中的VR展示 那篇主要是卡片的3D转动来展示未显示的部分图片 这篇 我们来点科幻的 我们在卡片中播放视频的同时来拖动卡片或转动它 像下面那样 这个主要依赖了两个库 具体代码如下
  • 浅谈js宏观任务、微观任务

    js运行机制分为同步异步 异步又分为宏观事件和微观事件 同步异步 js是一门单线程语言 因此js在同一个时间里只能做一件事 单线程意味着 如果在同个时间有多个任务的话 这些任务就需要排队 前一个执行完成才能执行下一个任务 同步任务 同步任务