js异步编程终级解决方案 async/await

在最新的ES7(ES2017)中提出的前端异步特性:async、await。

async、await是什么

async顾名思义是”异步”的意思,async用于声明一个函数是异步的。而await从字面意思上是”等待”的意思,就是用于等待异步完成。并且await只能在async函数中使用

通常async、await都是跟随Promise一起使用的。为什么这么说呢?因为async返回的都是一个Promise对象同时async适用于任何类型的函数上。这样await得到的就是一个Promise对象(如果不是Promise对象的话那async返回的是什么 就是什么);

await得到Promise对象之后就等待Promise接下来的resolve或者reject。

async、await解决了什么问题

先来看下没有async/await之前js是如何处理异步操作的:

传统的回调地狱式写法:

js异步编程终级解决方案  async/await

Promise改进后的写法:

js异步编程终级解决方案  async/await

async/await改进后:

js异步编程终级解决方案  async/await

async、await写法

先来看下同步的写法

1 console.log(1);
2
3 setTimeout(function () {
4   console.log(2);
5 }, 1000);
6
7 console.log(3);

下图是输出结果:

js异步编程终级解决方案  async/await

可以看到输出的顺序并不是我们代码中所写的那样,下面来看下async、await是如何解决这个问题的

1 (async function () {
 2
 3   console.log(1);
 4
 5   await new Promise(function (resolve, reject) {  7     setTimeout(function () {
 8       console.log(2);
 9       resolve();
10     }, 1000);
11   });
12
13   console.log(3);
14
15 }())

js异步编程终级解决方案  async/await

可以看到这中写法的输出已经符合了我们的预期,中间还多输出了一个Promise对象,这个原理可以用MDN上的官方定义来解释一下。

先来看下 async是如何定义的

When an async function is called, it returns a Promise. When the async function returns a value,
the Promise will be resolved with the returned value. When the async function throws an exception
or some value, the Promise will be rejected with the thrown value.

这里说了三件事情

  • async函数会返回一个Promise对象;
  • 如果async函数中是return一个值,这个值就是Promise对象中resolve的值;
  • 如果async函数中是throw一个值,这个值就是Promise对象中reject的值;

再来看下 await的定义

An async function can contain an await expression, that pauses the execution of the async
function and watis for the passed Promise’s resolution, and then resumes the async
function’s execution and returns the resolved value.

这里是说await会暂停当前async函数的执行,等待后面的promise的计算结果后再继续当前的async函数。

看到这里就明白了,首先, await只能在async里面;然后, await后面要跟一个promise对象;

常规的promise对象会被js先暂存到 eventloop(事件队列)中,因为js是单线程执行的,等 执行栈空了之后,才会将事件队列中的事件取出放入执行栈中执行。

上述代码中先是将整段代码改造成了一个async(async可以用于任何函数)函数,然后又将setTimeOut改造成了一个Promise对象。

这里我做了一下实验,如果改造后的Promise对象不加resolve()会是什么情况:

1 (async function () {
 2
 3   console.log(1);
 4
 5   await new Promise(resolve => {
 6     setTimeout(() => {
 7       console.log(2);
 8     }, 1000);
 9   });
10   console.log(3);
11 }())

js异步编程终级解决方案  async/await

可以看到结果是这个样子,也就是说如果await后面等待的Promise对象如何不进行resolve() 的话,async函数就无法继续(至少我现在是这样理解的)。那如果await后面等的不是Promise对象呢,async还能继续走下去吗。

这里我写了个简单的代码测试了一下:

1 function getSomething() {
 2     console.log("something");
 3 }
 4
 5 async function testAsync() {
 6     console.log("hello async");
 7 }
 8
 9 async function test() {
10     await getSomething();
11     await testAsync();
12 }
13
14 test();

js异步编程终级解决方案  async/await

显而易见,如果await后面等是普通函数的话,那就会照常执行,和不加await是一样的。

总结一下,async/await就是为了解决异步回调而生的,它可以让你的异步代码写的像同步的一样具有良好的可读性,以上就是本人对async/await的一些理解,不足之处请指正,谢谢。

Original: https://www.cnblogs.com/zhusihua/p/10728722.html
Author: 拉通对齐端到端
Title: js异步编程终级解决方案 async/await

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/591758/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 条件控制

    1. 顺序结构 java代码顺序执行 2. 选择结构 if语句 格式 if(结果为booblean类型的表达式){ 语句体; } if(结果为booblean类型的表达式){ 语句…

    数据库 2023年6月14日
    054
  • 赞!7000 字学习笔记,一天搞定 MySQL

    MySQL近两年一直稳居第二,随时有可能超过Oracle计晋升为第一名,因为MySQL的性能一直在被优化,同时安全机制也是逐渐成熟,更重要的是开源免费的。 MySQL是一种关系数据…

    数据库 2023年6月9日
    079
  • SQL子查询:介绍及分类

    子查询指一个查询语句 嵌套在另一个查询语句内部的查询。 例如:挑选出 员工工资表中, 工资金额比”张三”高的 员工姓名及 工资:d SELECT &…

    数据库 2023年6月16日
    098
  • 线程的同步

    线程同步机制同步块:Java中提供了同步机制,可以有效的防止资源冲突。同步机制使用 synchronized关键字 使用该关键字的代码块称为同步块。同步块 语法: synchron…

    数据库 2023年6月16日
    0124
  • centos下安装myrocksdb

    承接上一篇,https://www.cnblogs.com/lunyu/p/10190364.html 。编译安装myrocks的整个过程,特别是第2步和第7步,让人冗长难耐。因此…

    数据库 2023年6月14日
    0114
  • 设计模式之(8)——代理模式

    定义:为某个对象提供一个代理,以达到对这个对象的访问控制,代理类和委托类有共同的父类或者父接口,这样可以在使用委托类的地方都可以使用代理对象来替换(这符合程序设计中的”…

    数据库 2023年6月14日
    080
  • MySQL进阶系列:一文详解explain

    explain有何用处呢: 为了知道优化SQL语句的执行,需要查看SQL语句的具体执行过程,以加快SQL语句的执行效率。 ​ 可以使用explain+SQL语句来模拟优化器执行SQ…

    数据库 2023年5月24日
    0127
  • MySQL实战45讲 20

    20 | 幻读是什么,幻读有什么问题? 建表和初始化语句如下 CREATE TABLE t ( id int(11) NOT NULL, c int(11) DEFAULT NUL…

    数据库 2023年5月24日
    092
  • django中的模板层简介

    1.什么是模板层 模板层可以根据视图中传递的字典数据动态生产相应的HTML页面 2.模板层的配置 1.在项目&am…

    数据库 2023年6月14日
    078
  • day03-3私聊功能

    多用户即时通讯系统03 4.编码实现02 4.4功能实现-私聊功能实现 4.4.1思路分析 客户端 – 发送者: 用户在控制台输入信息,客户端接收内容 将消息构建成Me…

    数据库 2023年6月11日
    065
  • MySQL并行复制(MTS)原理(完整版)

    MySQL 5.6并行复制架构 MySQL 5.7并行复制原理 Master 组提交(group commit) 支持并行复制的GTID slave LOGICAL_CLOCK(由…

    数据库 2023年6月16日
    0100
  • tomcat上部署jenkins

    tomcat上部署jenkins tomcat上部署jenkins 部署tomcat 部署jenkins Jenkins创建流水线任务 主机名称 IP地址 需要的应用服务 工具包 …

    数据库 2023年6月14日
    084
  • win10搜索功能用不了

    这玩意搞了我今天,直接裂开!系统更新根本解决不了 好在查了相关资料才知道,原来微软在 Win10 的更新中,将搜索功能和语音助手 Cortana 进行了拆分,搜索成了一个独立的功能…

    数据库 2023年6月14日
    066
  • Docker Mysql安装和启动

    1、拉取mysql镜像 前往docker官网dockerhub在这里插入图片描述可以在红框内选择指定版本,例如 <span class=”token function”&gt…

    数据库 2023年6月6日
    081
  • 正则表达式

    正则表达式:REGEXP,REGular EXPression。正则表达式分为两类: Basic REGEXP(基本正则表达式 Extended REGEXP(扩展正则表达式) 元…

    数据库 2023年6月15日
    0141
  • MySQL实战45讲 18

    18 | 为什么这些SQL语句逻辑相同,性能却差异巨大? 在 MySQL 中,有很多看上去逻辑相同,但性能却差异巨大的 SQL 语句。对这些语句使用不当的话,就会不经意间导致整个数…

    数据库 2023年5月24日
    098
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球