async 和 await 原来这么简单

前言

前端同学们可能都知道 asyncawait 的使用,当被面试官问到 asyncawait 的是什么?或者说一说你对 asyncawait 的理解?如果我们还是仅仅去阐述我是如何使用的就显得格外的苍白无力。今天博主就来带大家进一步认识我们的 asyncawait。首先来说由于浏览器/引擎负责解释和执行JavaScript的主线程是单线程,同步执行一个耗时较大的任务会导致阻塞。异步执行代码就是来解决阻塞问题,但会带来顺序的不确定性(多个异步执行过程的不确定性)

回调函数

如果说这些异步之间不会相互依赖或者不会因为顺序不确定收到影响是么有关系的,但是如果我们一些逻辑需要依赖某个异步的返回值那么这个时候我们就需要保证执行顺序,这时候我们就需到了回调函数,举个例子:fun2需要fun1异步执行后的结果,fun3又依赖于 fun2 异步执行结束后的结果,所以我们通过回调函数来保证执行顺序。

在这里插入图片描述

Promise

我们能够看出上面的代码中,多级嵌套的回调函数,弊端很多:不直观,强耦合,回调的不确定性,不利于维护与复用,我们上面仅仅是非常简单的一个场景,那如果我们有很复杂的需求的话非常多的回调嵌套就容易产生回调地狱。为了解决这个问题,Promise 出现了,它将这种回调函数的嵌套改为链式调用。并用then保证执行顺序。Promise还能保证每次返回的都是一个新的Promise对象,所以代码一定被异步执行。

在这里插入图片描述

在这里插入图片描述

我们发现上面的代码可读性就明显略胜一筹,通过这样一个链式的结构让我们清晰的看出谁依赖谁,对我们的后期代码维护更加友好,但这也仅仅是我们的一个小小的案例,如果是复杂的业务的话我们一直链式其实可读性也会随之增多也变得费劲。

async、await

Promise 是为了避免回调地狱的,但是 Promise 还是不够简明,语义化,随着业务逻辑的增加可能会有超级多 then 于是有了async和await,先从字面意思来理解: async 是“异步”的简写,而 await 可以认为是 async wait 的简写,所以应该很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。async 和 await 是es7提供的语法,是 es7最重要特性之一,相比于es6的promise ,具有更高的代码可读性,因此也被称为promise 的语法糖。它把异步执行的代码写得像同步代码那样直观。

async

快速创建一个异步函数,我们的 async 包裹后的函数就自动转化成一个异步的 Promise 下面我们来证实一下

在这里插入图片描述

在这里插入图片描述

按照我们的理解,其实上面的log应该打印的是我们的 return 出来的几何心凉对吧,但是他打印出来的是一个 Promise 等同于下面的代码,当然这种只是我们的函数中仅仅是返回一个结果,但如果我们涉及到业务或者负责内容的时候还是需要我们去书写 promise 的,这点也比较鸡肋。

<body><script>function fun1() {let p = new Promise(rv => {rv('几何心凉')})return p}console.log(fun1())</script>
</body>

await

await 并不是将异步代码转化成同步,他只是改变了调用方式,让我们从调用的代码层面看着相似于同步,从而增加代码的可读性;而且 await 也不是在任何地方都可以用的,它只能使用在 async 和模块中使用,首先让我们来看一下在 async 中的使用;

在这里插入图片描述

在这里插入图片描述

说明: 调用异步函数时,在函数前直接使用await对函数进行调用,一旦遇到await就会立即返回一个pending状态的Promise对象,暂时返回执行代码的控制权,使得函数外的代码得以继续执行,这是保证非阻塞的部分。他会等待 Promise 函数返回结果,可以通过变量来接收这个结果;既然是等待了那不就是说明阻塞了么?其实并不是我们可以看到图中的 fun4 前面加上了 async 就说明我们的 fun4 是异步的了,异步代码就不会阻塞后面的代码执行,而我们的 await 是在异步函数中去控制了依赖项的执行顺序。

当然在我们的 Promise 中我们出现了报错我们是通过 catch 然后去处理的,在我们的 await 中我们又该如何处理呢?当然我们可以通过我们同步的办法 try-catch 来处理异常

在这里插入图片描述

刚才我们上面提到说我们的 await 可以在模块中使用,下面我们来看一下如何在模块中使用:上面的例子如果我们直接把黄色框中的内容放到我们的外部来;执行会报错,但是我们把 script 的类型改成模块就可以了;注意如果改成模块的话,我们 await 只能在最外层作用域中使用;

在这里插入图片描述

在这里插入图片描述

小结

我们的代码中会通过异步的方式来防止代码阻塞,当我们多个异步之间有相互的执行结果依赖的时候我们就需要锁定他们的执行顺序,早起的回调函数为我们解决了不确定顺序的问题,但是由于大批量的使用回调函数,造成代码的可读性、维护性非常低,后面出现了我们的 Promise 通过 then 进行链式结构,提高了可读性,但是随着业务的复杂度增加我们的链式可读性也会随之降低,所以es7出现了 async、await 改变了调用的方式,让调用呈现出来的代码相似于同步,进而提升代码可读性,async: 通过 async 声明的函数,它的返回值会自动包装为 Promise,它声明的异步函数中可以通过 await 去调用其他的异步函数,await: 让我们通过同步的方式去调用异步函数,让我们的代码可读性更高,await 的使用位置有两个,一个是我们 async 声明的异步函数中,一个是我们的 js 模块的最外层作用域中;

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

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

相关文章

我为何在 CSDN 乐在其中

文章目录写在前面成为博主究竟能得到什么&#xff1f;内在提升耀眼名片丰富眼界提升知名度博客》变现写在最后写在前面 各位伙伴大家好&#xff0c;我是几何心凉&#xff0c;一位不是很大的也不是很小的博主&#xff0c;今天想要跟大家去聊一些比较实在的内容&#xff1b;大家能…

10分钟设置免费远程桌面

文章目录前言远程桌面设置教程启动Amazon Lightsail实例配置远程桌面启动远程桌面使用远程桌面前言 “你见过洛杉矶凌晨4点的样子吗&#xff1f;” 没有也没关系&#xff0c;你可以轻松配置一台位于洛杉矶的免费远程桌面。 利用Amazon全球可用区&#xff0c;甚至可以在世界各…

BZOJ2690: 字符串游戏(平衡树动态维护Dfs序)

Description 给定N个仅有a~z组成的字符串ai,每个字符串都有一个权值vi,有M次操作&#xff0c;操作分三种&#xff1a;Cv x v:把第x个字符串的权值修改为vCs x a:把第x个字符串修改成aQ:求出当前的最大权字符串集合&#xff0c;使得这个集合中的字符串经过重新排列后满足除最后一…

【第一趴】初探uni-app(uni-app发行者、uni-app推出背景、为什么选择uni-app)

文章目录写在前面DCloud当下跨平台开发存在的问题为什么选择uni-app写在最后写在前面 聚沙成塔——每天进步一点点&#xff0c;大家好我是几何心凉&#xff0c;不难发现越来越多的前端招聘JD中都加入了uni-app 这一项&#xff0c;它也已经成为前端开发者不可或缺的一项技能了&…

Rocket - tilelink - Atomics

https://mp.weixin.qq.com/s/TSwKL_qm-b-0e8x7r--hhg 简单介绍Atomics中数学运算、逻辑运算的实现。​​1. ioAtomics是一个硬件模块&#xff0c;他继承自Modules&#xff1a;​​IO端口定义如下&#xff1a;​​其中&#xff1a;a. write: 是否写操作&#xff1b;b. a&#xf…

“勤学会”火爆来袭

文章目录勤学会是什么&#xff1f;勤学会存在的意义是什么强大的助学团勤学会如何帮助大家学习参与勤学会能得什么奖品专属C计划加入勤学会勤学会是什么&#xff1f; 他来了他来了&#xff0c;其实两个月前勤学会的概念产品就已经出现了&#xff0c;只不过因为了 1024 大型活动…

LeetCode -- 204. Count Primes

题目标签 HashTab&#xff08;哈希表&#xff09; 题意及思路 题意&#xff1a;略 思路&#xff1a;有关素数的题目我所知道有两种做法。一种是最基本的isPrime算法&#xff0c;关键点在循环判断时&#xff0c;上限为Math.sqrt(n) &#xff08;求n是否为素数&#xff09;。另外…

如何寻找无序数组中的第K大元素?

如何寻找无序数组中的第K大元素&#xff1f; 有这样一个算法题&#xff1a;有一个无序数组&#xff0c;要求找出数组中的第K大元素。比如给定的无序数组如下所示&#xff1a; 如果k6&#xff0c;也就是要寻找第6大的元素&#xff0c;很显然&#xff0c;数组中第一大元素是24&am…

测试MongoDB的自动分片

MongoDB的自动分片&#xff1a; test库分片配置&#xff1a; db.shards.find(){ "_id" : "shard0000", "host" : "127.0.0.1:29017", "state" : 1 }{ "_id" : "shard0001", "host" : "1…

线上CPU飚高(死循环,死锁……)?帮你迅速定位代码位置

top基本使用&#xff1a; top命令参考本篇文章 查看内存和CPU的top命令&#xff0c;别看输出一大堆&#xff0c;理解了其实很简单 top 命令运行图&#xff1a; 第一行&#xff1a;基本信息 第二行&#xff1a;任务信息 第三行&#xff1a;CPU使用情况 第四行&#xff1a;物理内…

zookeeper watch笔记

ZK其核心原理满足CP, 实现的是最终一致性, 它只保证顺序一致性. zookeeper 基于 zxid 以及阻塞队列的方式来实现请求的顺序一致性。如果一个client连接到一个最新的 follower 上&#xff0c;那么它 read 读取到了最新的数据&#xff0c;然后 client 由于网络原因重新连接到 zoo…

单机简单搭建一个kafka集群(没有进行内核参数和JVM的调优)

1.JDK安装 在我的部署单节点kafka的博客里有相关的方法。&#xff08;https://www.cnblogs.com/ToBeExpert/p/9789486.html &#xff09;zookeeper和kafka的压缩包下载地址也在单节点部署的这篇博客里。 1.zookeeper集群的搭建 将zookeeper.tar.gz解压为三个目录&#xff0c;例…

[翻译]三张卡片帮你记住TDD的基本原则

原文地址&#xff1a;http://blog.briandicroce.com/2008/03/14/three-index-cards-to-easily-remember-the-essence-of-test-driven-development/ 当我浏览ObjectMentor的博客的时候&#xff0c;其中一篇Tim Ottinger的“TDD on Three Index Cards”引起了我的注意。他回忆了他…

凉哥核心圈程序员必备十大图书推荐(一)

写在前面 凉哥核心圈程序员必备十大图书推荐&#xff08;一&#xff09;&#xff0c;各位伙伴应该一目了然了哈&#xff0c;没错凉哥准备出一系列图书推荐的文章&#xff0c;其实很多朋友在私下问凉哥除了大学的课程外自己要不要读一些技术类的书籍呢&#xff0c;答案当时要的…

了解大数据的特点、来源与数据呈现方式

本次作业来源于&#xff1a;https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2639 1.浏览2019春节各种大数据分析报告&#xff0c;例如&#xff1a; 这世间&#xff0c;再无第二个国家有能力承载如此庞大的人流量。http://www.sohu.com/a/290025769_313993春节人口迁…

强大而优雅,API 研发管理 EOLINKER 新版正式发布!

EOLINKER 于2019年3月3日正式发布新版本&#xff01;该版本大幅强化各个产品的功能、着重优化了全站的用户交互体验&#xff0c;并且EOLINKER AMS 产品正式更名为 EOLINKER API Studio ——API 工作室&#xff0c;旨在为您提供API文档管理、自动化测试以及开发协作等全方位服务…

MATLAB 与 Excel 接口

MATLAB 与 Excel 接口MATLAB 与 Excel 有两种接口方式&#xff1a;一种是通过 MATLAB 提供的 Excel 生成器&#xff0c;生成220 MATLAB 实用教程DLL 组件和 VBA 代码&#xff0c;实现 Excel 对 MATLAB 的调用&#xff1b;另一种是利用 MATLAB 提供的 Excellink 插件&#xff0c…

计算 1+2!+3!+4!+...20!=?

package algs.factorial;import java.math.BigInteger;/*** Author: areful* Date: 2019/3/6* 计算 sum(n!), n1,2, ... 20*/ public class NFactorial {public static void main(String[] args) {System.out.println(calcFactorial0(3));System.out.println(calcFactorial1(3)…

区块链基础语言(三)——Go语言开发工具

一、在Windows系统安装Goland 1.1 下载 官网地址&#xff1a;https://www.jetbrains.com/go/download/#sectionwindows 1.2 安装 a. 双击“goland-2018.1.5.exe”&#xff0c;单击“运行”&#xff0c;如图1所示&#xff1b; <图1> b. 如图2所示&#xff0c;单击“next”…

准备重新开始写了

工作很忙,而且前一段时间项目组由于方向和人员调整一直很动荡,所以就没有心情和时间来整理技术.准备重新开张了,好好写,争取每个月出一到两篇说得过去的文章.转载于:https://www.cnblogs.com/sun/archive/2008/06/12/1218220.html