同步、异步

何为同步异步

同步任务(synchronous

  1. 同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
  2. 同步任务进栈顺序:先进后出,后进先出;(栈只有一端开口);
  3. 同步会阻塞程序的执行;

同步任务:页面的初始化、DOM 操作、计算任务;

大白话:同步就是我强依赖于你(对方),我必须等到你的回复,才能去做下一步的事情。

异步任务(asynchronous

  1. 不进入主线程,而进入任务队列的任务,只有等主线程任务执行完毕,任务队列开始通知主线程,请求执行任务,该任务才会进入主线程执行。
  2. 异步任务进任务队列顺序:先进先出,后进后出;(队列有两端开口);
  3. 异步不会阻塞程序的执行;

异步任务: 网络请求、定时器、事件处理、异步函数;

大白话:异步就是我并不强依赖于你,我对你是否回不回复我的信息并不在意,无论你回不回复我,我都会继续去做我的事情。

一、JavaScript是一门单线程语言

总所周知,JavaScript是一门单线程语言。单线程是指JavaScript引擎执行JavaScript时只分了一个线程给它执行,所以说执行JavaScript时是单线程的。

二、何为进程?何为线程?

进程:

进程是指在计算机系统中正在执行的一个程序实例。一个程序可以创建一个或多个进程(例如:打开一个浏览器,在浏览器上打开多个网页),每个进程都有自己的内存空间、执行状态和资源使用情况。进程是操作系统对程序的一次动态执行过程的抽象。

多进程示例:

  1. 浏览器是多进程
  2. 不同类型的标签页都会开启一个新的进程
  3. 相同类型的标签页是会合并到一个进程

线程:

线程是CPU调度的最小单位,是建立在进程的基础上运行的单位,共享进程的内存空间。(CPU是电脑的大脑,可以同时打开多个程序(也可以抽象地理解为软件),例如:QQ、微信,一个线程分配给QQ,一个给微信)

三、单线程意味着什么?

JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待。也就是说代码只能同步执行,必须执行上一行才能执行下一行。然而并不是还有异步

四、微任务与宏任务

微任务(microtask)

  1. 微任务会在当前任务执行完成后立即执行,在浏览器渲染之前执行。
  2. 微任务具有较高的优先级,在每个事件循环中会在宏任务执行之前执行。

微任务:Promise async/await 、Object.observe MutationObserver、 process.nextTick(Node.js 环境)。

宏任务(macrotask)

  1. 宏任务会在事件循环中执行,一般来自外部的事件,如定时器事件、UI交互事件和网络请求事件等。

宏任务setTimeout、setInterval、Ajax、DOM事件 、script(整体代码) 、I/O、UI交互事件、setImmediate(Node.js 环境)。

总结

[ 宏任务、微任务 ]是指JavaScript中异步任务的两种不同任务的分类,宏任务类似于整体的异步任务,微任务则是宏任务中的一个子任务。

  • 宏任务表示需要异步执行的任务
  • 微任务表示宏任务执行后需要立即执行的子任务

如下图所示:微任务优先级 > 宏任务优先级

五、事件循环(Event Loop)又被称为事件轮询

JavaScript的异步编程通过执行栈和消息队列来实现。首先所有的同步任务都是在主线程上执行的,它会形成一个执行栈,异步任务不会在主线程上执行,当异步任务得到响应(如某个点击事件、服务加载完成、setTimeout等待时间截止)就会被推入消息队列中。当执行栈里面的任务执行完的时候(栈空),JS引擎就会去消息队列中读取任务,它会把这个任务中的回调函数压入执行栈中,然后执行栈就又开始新的同步任务执行。


这种执行栈空就去消息队列读取任务的过程时不断循环的,每次栈空都会去消息队列读取任务,如果没有任务就一直等待,知道有新的任务出现,这叫做事件循环(event Loop)。

六、练习题

// 第一题
console.log("开始");setTimeout(function() {console.log("定时器回调函数");
}, 0);console.log("结束");// 第二题
console.log("开始");setTimeout(function() {console.log("定时器回调函数");
}, 0);Promise.resolve().then(function() {console.log("微任务");
});console.log("结束");// 第三题
console.log("开始");setTimeout(function() {console.log("定时器回调函数");
}, 0);Promise.resolve().then(function() {console.log("微任务1");
}).then(function() {console.log("微任务2");
});console.log("结束");// 第四题
console.log("开始");setTimeout(function() {console.log("定时器回调函数");
}, 0);Promise.resolve().then(function() {console.log("微任务1");Promise.resolve().then(function() {console.log("微任务2");});
});console.log("结束");// 第五题
console.log("开始");setTimeout(function() {console.log("定时器回调函数1");Promise.resolve().then(function() {console.log("嵌套微任务1");});
}, 0);setTimeout(function() {console.log("定时器回调函数2");
}, 0);Promise.resolve().then(function() {console.log("微任务");
});console.log("结束");// 第六题
console.log('script start');setTimeout(function() {console.log('setTimeout');
}, 0);Promise.resolve().then(function() {console.log('promise1');
}).then(function() {console.log('promise2');
});console.log('script end');// 第七题
console.log('script start');setTimeout(function() {console.log('setTimeout1');
}, 0);Promise.resolve().then(function() {console.log('promise1');
}).then(function() {console.log('promise2');
});setTimeout(function() {console.log('setTimeout2');
}, 0);console.log('script end');// 第八题
async function async1() {console.log('async1 start');await async2();console.log('async1 end');
}async function async2() {console.log('async2');
}console.log('script start');setTimeout(function() {console.log('setTimeout');
}, 0);async1();new Promise(function(resolve) {console.log('promise1');resolve();
}).then(function() {console.log('promise2');
});console.log('script end');

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

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

相关文章

rust生命期

一、生命期是什么 生命期,又叫生存期,就是变量的有效期。 实例1 {let r;{let x 5;r &x;}println!("r: {}", r); }编译错误,原因是r所引用的值已经被释放。 上图中的绿色范围’a表示r的生命期,蓝色范围’b表示…

Java进阶篇--网络编程

​​​​​​​ 目录 计算机网络体系结构 什么是网络协议? 为什么要对网络协议分层? 网络通信协议 TCP/IP 协议族 应用层 运输层 网络层 数据链路层 物理层 TCP/IP 协议族 TCP的三次握手四次挥手 TCP报文的头部结构 三次握手 四次挥手 …

整理mongodb文档:副本集二

个人博客 整理mongodb文档:副本集二 个人博客,求推荐,本片内容较为乱 文章概叙 本文章主要讲在MongoDB的副本集中的一些注意点,主要是如何对seconadry进行数据操作,以及对更新数据的一些介绍 查看当前节点 上一集讲了关于搭…

Windows下安装MySQL8详细教程

Windows下安装MySQL8详细教程 因为需要在Windows下安装MySQL8的数据库,做一个临时数据库环境。 1.准备软件 使用社区版本,下载地址如下: https://dev.mysql.com/downloads/mysql/ 使用8.0.16版本,需要在归档中查找 选择版本&a…

《Upload-Labs》01. Pass 1~13

Upload-Labs 索引前言Pass-01题解 Pass-02题解总结 Pass-03题解总结 Pass-04题解 Pass-05题解总结 Pass-06题解总结 Pass-07题解总结 Pass-08题解总结 Pass-09题解 Pass-10题解 Pass-11题解 Pass-12题解总结 Pass-13题解 靶场部署在 VMware - Win7。 靶场地址:https…

【数据结构】队列和栈

大家中秋节快乐,玩了好几天没有学习,今天分享的是栈以及队列的相关知识,以及栈和队列相关的面试题 1.栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作…

嵌入式学习笔记(35)外部中断

6.9.1什么是外部中断 (1)内部中断就是指中断源来自于SoC内部(一般是内部外设),譬如串口、定时器等部件产生的中断;外部中断是SoC外部的设备,通过外部中断对应的GPIO引脚产生的中断。 (2)按键在SoC中就使用了外部中断…

【CMU15-445 Part-14】Query Planning Optimization I

Part14-Query Planning & Optimization I SQL is Declarative,只告诉想要什么而不需要说怎么做。 IBM System R是第一个实现query optimizer查询优化器的系统 Heuristics / Rules 条件触发 静态规则,重写query来remove 低效或者愚蠢的东西&#xf…

No156.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

驱动开发:STM32F7控制AD5663模拟量输出

AD5663是ADI公司的一款DAC模块,用以实现两路模拟量信号输出。该芯片通过SPI通信来驱动。下面讲解使用STM32F7主控芯片来控制AD5663模拟量输出的流程。 配置STM32F7 SPI通信管脚 STM32CubeMX生成SPI驱动代码 /* SPI3 init function */ void MX_SPI3_Init(void) {/*…

阿里巴巴OceanBase介绍

前言 官网地址:https://www.oceanbase.com/ OceanBase是由蚂蚁集团完全自主研发的国产原生分布式数据库,始创于2010年。是全球唯一在 TPC-C 和 TPC-H 测试上都刷新了世界纪录的国产原生分布式数据库。 2010年,创始人阳振坤加入阿里巴巴&…

UE5屏幕适配

一、本程序设计发布在手机上,首先确定屏幕的设计分辨率,这里我们选择iphone6s,750x1334。 二、设置DPI Scale为1.0的比例,点击齿轮标志 因为我们这个程序是手机竖屏使用的,所以DPI Scale Rule选择Shortest Side&#…

博弈论中静态博弈经典场景案例

博弈论中静态博弈经典场景案例 1、齐威王田忌赛马 田忌赛马是中国家喻户晓的故事,故事讲述的是齐国大将田忌的谋士孙膑如何运用计谋帮助田忌在与齐威王赛马时以弱胜强的故事,这个故事其实本质也是一个博弈的过程。     齐威王要和田忌赛马&#xff…

【MySQL】数据类型(二)

文章目录 一. char字符串类型二. varchar字符串类型2.1 char和varchar比较 三. 日期和时间类型四. enum和set类型4.1 set的查询 结束语 一. char字符串类型 char (L) 固定长度字符串 L是可以存储的长度,单位是字符,最大长度是255 MySQL中的字符&#xff…

CocosCreator3.8研究笔记(二十三)CocosCreator 动画系统-动画编辑器相关功能面板说明

国庆假期,闲着没事,在家研究技术~ 上一篇,我们介绍了动画剪辑、动画组件以及基本的使用流程,感兴趣的朋友可以前往阅读: CocosCreator 动画系统-动画剪辑和动画组件介绍。 今天,主要介绍动画编辑器相关功能…

【图论C++】树的重心——教父POJ 3107(链式前向星的使用)

》》》算法竞赛 /*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在竞赛算法学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记:转载…

腾讯mini项目-【指标监控服务重构-会议记录】2023-07-21

2023-07-21 组长会议纪要 A组 文档学习差不多,还没掌握如何使用sdk进行上报venus启动服务的3个ToDo 添加什么错误处理 ErrHandler : fiber的错误处理,是运行过程Handler中的错误,在全局的ErrHandler,进行错误处理&am…

app专项测试:app弱网测试

背景 用户体验 APP使用过程中,弱网的高延迟和高丢包,在实时性要求非常高的场景,容易伤害用户体验 非正常情况下,Bug出现几率会增加 在解决日常支持需求中,经常出现一些用户反馈的Bug无法复现,有很大部分…

线性代数(七) 矩阵分析

前言 从性线变换我们得出,矩阵和函数是密不可分的。如何用函数的思维来分析矩阵。 矩阵的序列 通过这个定义我们就定义了矩阵序列的收敛性。 研究矩阵序列收敛性的常用方法,是用《常见向量范数和矩阵范数》来研究矩阵序列的极限。 长度是范数的一个特…

三翼鸟三周年:三次升级,全面引领

被誉为“竞争战略之父”的迈克尔波特,曾提出过“差异化竞争”的理念。 简单说,企业在“差异化竞争”中要做到三大法则: 人无我有、人有我优、人有我新。 在许多优秀企业的身上,都能看到差异化的影子,比如华为、海尔…