同步、异步

news2024/11/16 10:53:22

何为同步异步

同步任务(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.coloradmin.cn/o/1047796.html

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

相关文章

天猫商品详情数据接口用于上货

天猫商品详情数据接口可以用于上货,具体操作步骤如下: 申请一个淘宝开放平台的应用,并获取到 App Key 和 App Secret。使用淘宝开放平台的淘宝客商品详情查询接口(taobao.tbk.item.info.get),传入商品 ID&…

抖音开放平台第三方代小程序开发,一整套流程

大家好,我是小悟 抖音小程序第三方平台开发着力于解决抖音生态体系内的小程序管理问题,一套模板,随处部署。能尽可能地减少服务商的开发成本,服务商只用开发一套小程序代码作为模板就可以快速批量的孵化出大量的商家小程序。 第…

mp3stego(mp3隐写工具)使用手册

mp3stego是一个在通用的MP3音频文件中隐写的软件,对MP3进行隐写。 使用方法一,命令行运行 首先打开windows的命令行cmd(同时按winR,输入CMD即可) ​将下载好的MP3Stego解压缩到指定目录(最好路径不要有中…

数据挖掘note(赵老师语录)

(一) 数据挖掘一般分为机器学习和统计学习,大数据学的课程一般是关于机器学习,我们学的浅,主要关于统计学习,示意图如下所示: 这是一个大数据时代,但是数据挖掘的利用率不足0.5%&am…

面试题:Web View如何做测试?

Web View(网页视图)是一种用于在应用程序中显示网页内容的组件或控件。提供了一种将网页内容嵌入到应用程序中的方式,使用户能够在应用程序中浏览和交互网页。 Web View通常用于开发移动应用程序,特别是混合应用程序(…

宝塔nginx搭建Ftp文件服务器

一:创建FTP 填入账号密码后,选择根目录,这个根目录就是nginx要代理的目录 二:配置nginx root的地址就是上面填的FTP根目录 三:http访问 服务器ip端口号加图片 例如我放了一个320.jp 我服务器ip是110.120.120.120 那…

Palantir大数据技术在乌克兰战场的应用

源自:北京蓝德信息科技有限公司 Meta Constellation软件系统 人工智能平台(AIP) 应用分析 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨,并不意味着支持其观点或证实其内容的真实性。版权归原作者所有,如转载稿…

SOC芯片学习--GPIO简介

原创 硬件设计技术 硬件设计技术 2023-07-20 00:04 发表于广东 收录于合集#集成电路--IC7个 一、GPIO定义、分类: GPIO(英语:General-purpose input/output),通用型之输入输出的简称,其接脚可以供使用者由…

从芯片到软件,中国高科技体系完全自主化,比尔盖茨的预言成真

日前中国一家高科技企业举行发布会,虽然没有就手机发言,主要宣传汽车、穿戴等产品,而这恰恰反映出它开始将软件系统贯穿到诸多行业,而且自研芯片也在这些行业广泛应用,由此国产高科技从芯片到软件已形成自主体系。 此前…

动手吧,vue做个好看的按钮01

看下效果吧&#xff1a; ---直接上代码喽--- 1、template部分 <div class"box"><div class"butt" click"buttClick"><div>哈哈哈</div></div></div> 2、css部分 .box {width: 500px;height: 300px;disp…

运动控制:直流电机

一、电机的分类 从性能来看&#xff0c;直流和交流的主要区别在于对速度的控制上。直流电机的速度正比于电压&#xff0c;而交流电机的速度正比于频率及磁极数。直流和交流都可以应用于伺服系统&#xff0c;但是交流电机可以承受更高的电流&#xff0c;所以工业应用中&#xff…

第二证券:国庆档票房有望延续复苏态势 海风拐点已至

昨日&#xff0c;两市股指盘中强势轰动上扬&#xff0c;创业板指早盘一度涨近2%&#xff0c;随后涨幅逐渐收窄。到收盘&#xff0c;沪指涨0.16%报3107.32点&#xff0c;深成指涨0.44%报10104.32点&#xff0c;创业板指涨0.82%报2006.22点&#xff0c;两市算计成交7165亿元&…

【VUE复习·8】v-if;v-show高级

总览 1.v-if 与其变种 v-else-if&#xff1b;v-else 2.v-show 3.v-if 与 v-show 的区别和应用场景 一、v-if 这样用&#xff08;使用 data 或 函数 来驱动它&#xff09; 1.v-if v-if 的用法很简单&#xff0c;它判断的是后面语句的 boolean 值&#xff0c;用来控制 DOM 元…

uni-app:实现元素在屏幕中的居中(绝对定位absolute)

一、实现水平居中 效果 代码 <template><view><view class"center">我需要居中</view></view> </template><style>.center {position: absolute;left:50%;transform: translateX(-50%);border:1px solid black;} </s…

七、热力图展示

在开发3d模型之中&#xff0c;热力图是非常常见的需求&#xff0c;比如需要了解人口密度&#xff0c;空气质量&#xff0c;热力分布等这些都需要热力图来展示&#xff0c;那么3d常见的热力图是怎么实现的呢&#xff0c;现在我们就来看看。先看效果图。 思路&#xff1a; 1引入h…

如何训练聊天机器人面对复杂的语言环境和需求?

一些对话很容易规划 &#xff0c;以今天早上点咖啡为例 。它有可能以相互问候为开场白&#xff0c;然后转移到请求上 。也许还会反复交流&#xff0c;敲定一些小细节&#xff08;多大杯的咖啡&#xff0c;是否需要加奶油&#xff09;&#xff0c;然后付款&#xff0c;最后快速交…

【c语言的函数指针介绍】

C语言中的函数指针是一种特殊的指针&#xff0c;它指向函数而不是数据。函数指针允许你在运行时动态地选择要调用的函数&#xff0c;这使得你可以根据需要在不同的函数之间切换&#xff0c;或者将函数作为参数传递给其他函数。函数指针的声明和使用如下&#xff1a; 声明函数指…

3D孪生场景搭建:模型阵列摆放

阵列摆放概念 阵列摆放是指将物体、设备或元件按照一定的规则和间距排列组合的方式。在工程和科学领域中&#xff0c;阵列式摆放常常用于优化空间利用、提高效率或增强性能。 阵列摆放通常需要考虑间距、角度、方向、对称性等因素&#xff0c;以满足特定的要求和设计目标。不同…

【Element-UI】CUD(增删改)及form 表单验证(附源码)

目录 一、导言 1、引言 2、作用 二、CUD 1、增加修改 1.1、添加弹窗 1.2、定义变量 1.3、定义方法 1.4、完整代码 2、删除 2.1、定义方法 三、表单验证 1、添加规则 2、定义规则 3、提交事件 4、前端完整代码 一、导言 1、引言 增删改是计算机编程和数据库管理…

荣耀时刻!2023抖音电商作者峰会为优质直播间和卓越生态伙伴颁奖

9月27日&#xff0c;抖音电商在上海举行了以“向新成长”为主题的2023抖音电商作者峰会&#xff0c;并现场颁发了荣誉奖项。抖音电商优质直播间以及践行抖音电商作者精神四个维度的年度荣誉一一揭晓。 过去一年&#xff0c;数百万作者与众多品牌商家、MCN机构和精选联盟服务商…