async和await

async和awaitasync和await概念先从字面意思来理解。async是“异步”的简写,而await可以认为是asyncwait的简写。所以应该很好理解async用于申明一个function是异步的,而await用于等待一个异步方法执行完成。另外还有一个很有意思的语法规定,await只能出现在async函数中。然后细心的朋友会产生一个疑问,如果await只能出现在async函数中,那这个async函数应该怎么调用?如果需要通过await…

大家好,又见面了,我是你们的朋友全栈君。

async和await 概念

     先从字面意思来理解。async 是“异步”的简写,而 await 可以认为是 async wait 的简写。所以应该很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。

    另外还有一个很有意思的语法规定,await 只能出现在 async 函数中。然后细心的朋友会产生一个疑问,如果 await 只能出现在 async 函数中,那这个 async 函数应该怎么调用?

     如果需要通过 await 来调用一个 async 函数,那这个调用的外面必须得再包一个 async 函数,然后……进入死循环,永无出头之日……

  再来说说async有什么作用。

async的作用

       这个问题的关键在于,async 函数是怎么处理它的返回值的!

用return吗?那await做什么呢?试一下。

async和await 

看结果,我们知道返回的是一个promise对象。

async和await

      所以我们从中知道,async 函数返回的是一个 Promise 对象。async 函数(包含函数语句、函数表达式)会返回一个 Promise 对象,如果在函数中 return 一个直接量,async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象。

      async 函数返回的是一个 Promise 对象,所以在最外层不能用 await 获取其返回值的情况下,我们当然应该用原来的方式:then() 链来处理这个 Promise 对象,试一下

async和await

输出结果 ⬇

async和await 

 如果async函数没有返回值会报错吗?该返回什么?

 async和await

async和await 

  不会报错,直接返回undefined。

    在没有 await 的情况下执行 async 函数,它会立即执行,返回一个 Promise 对象,并且,绝不会阻塞后面的语句。这和普通返回 Promise 对象的函数并无二致。

那await是做什么用的:

    可以认为 await 是在等待一个 async 函数完成。await 等待的是一个表达式,这个表达式的计算结果是 Promise 对象或者其它值(换句话说,就是没有特殊限定)。

    因为 async 函数返回一个 Promise 对象,所以 await 可以用于等待一个 async 函数的返回值——这也可以说是 await 在等 async 函数,但要清楚,它等的实际是一个返回值。注意到 await 不仅仅用于等 Promise 对象,它可以等任意表达式的结果,所以,await 后面实际是可以接普通函数调用或者直接量的。找一个例子试试看。

 async和await

返回结果

async和await 

await等到结果之后呢?

     await 等到了它要等的东西,一个 Promise 对象,或者其它值,然后呢?我不得不先说,await 是个运算符,用于组成表达式,await 表达式的运算结果取决于它等的东西。

    如果它等到的不是一个 Promise 对象,那 await 表达式的运算结果就是它等到的东西。

    如果它等到的是一个 Promise 对象,await 就忙起来了,它会阻塞后面的代码,等着 Promise 对象 resolve,然后得到 resolve 的值,作为 await 表达式的运算结果。

    其实这就是 await 必须用在 async 函数中的原因。async 函数调用不会造成阻塞,它内部所有的阻塞都被封装在一个 Promise 对象中异步执行。

async/await帮我们做了啥?

先做个简单的比较吧 ⬇

    之前已经说明了 async 会将其后的函数的返回值封装成一个 Promise 对象,而 await 会等待这个 Promise 完成,并将其 resolve 的结果返回出来。

举个例子,用 setTimeout 模拟耗时的异步操作,先来看看不用 async/await 会怎么写

async和await

 再试试async/await

async和await

 

    我们看到 takeLongTime() 没有申明为 async。实际上,takeLongTime() 本身就是返回的 Promise 对象,加不加 async 结果都一样。

    又一个疑问产生了,这两段代码,两种方式对异步调用的处理(实际就是对 Promise 对象的处理)差别并不明显,甚至使用 async/await 还需要多写一些代码,那它的优势到底在哪?

async/await的优势在于处理 then:

    单一的 Promise 链并不能发现 async/await 的优势,但是,如果需要处理由多个 Promise 组成的 then 链的时候,优势就能体现出来了(Promise 通过 then 链来解决多层回调的问题,现在又用 async/await 来进一步优化它)。

    假设一个业务,分多个步骤完成,每个步骤都是异步的,而且依赖于上一个步骤的结果。我们仍然用 setTimeout 来模拟异步操作:

async和await

 现在用promise实现这三个步骤的处理async和await

输出结果

async和await

 结果和之前的 Promise 实现是一样的,但是这个代码看起来是不是清晰得多,几乎跟同步代码一样

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159247.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql的索引有哪几种_MySQL索引数据结构

    mysql的索引有哪几种_MySQL索引数据结构摘要腾兴网为您分享:mysql索引类型有哪些,易信,微商助手,刷机精灵,数字涂色等软件知识,以及家校即时通,内部通讯录,叫叫识字大冒险,天天酷跑,手机电视高清直播,短信验证软件,诛仙表情包,一手女装,iis7,instagram视频,搭建卡盟主站,umbrella,qq音乐qmc0格式,图片降噪,钢筋锈蚀检测仪等软件it资讯,欢迎关注腾兴网。介绍各种类型的mysql索引。1、普通索引普通索引…

    2022年8月12日
    6
  • this指针的介绍和用法

    this指针的介绍和用法参考书籍,孙鑫视频教学,百度等。—下文举的例子是错误的,楼主若有空会对此进行修改。记录时间:2019-3-4this指针的介绍this指针是面向对象程序设计的一项概念,在C++中,它表示当前运行的对象。在实现对象的方法时,this指针来获得该对象自身的引用。正如classFamily类,创建了Family类的两个对象,即Chen1和Chen2。(1)假如Family类是”…

    2022年5月17日
    48
  • TIME_WAIT过多的解决办法

    TIME_WAIT过多的解决办法执行主动关闭的那端经历了这个状态,并停留MSL(最长分节生命期)的2倍,即2MSL。TIME_WAIT存在的两个理由:1可靠的实现TCP全双工连接的终止2允许老的重复的分节在网络上的消逝第一个:如果客户端不维持TIME_WAIT状态,那么将响应给服务端一个RST,该分节被服务器解释成一个错误。如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流,那么必须正确的处…

    2022年6月9日
    46
  • Java入门基础学习总结[通俗易懂]

    Java入门基础学习总结[通俗易懂]基础(Basics)打开CMD的方式:1.开始+系统+命令提示符2.Win键+R输入cmd打开控制台(推荐使用)3.在任意的文件夹下面,按住shift键+鼠标右键点击,在此处打开命令行窗口4.资源管理器的地址栏前面加上cmd一个空格路径常用的Dos命令#盘符切换D:冒号需用英文模式#查看当前目录下的所有文件dir#切换目录cdchangedirectorycd.. 返回上级目录#清理屏幕cls(clearscreen)#退出终端exit#查看电脑的i

    2022年7月8日
    25
  • Linux vimrc常见配置

    Linux vimrc常见配置code效果setignorecase搜索模式里忽略大小写setnu设置vim显示代码行setsmartcase如果搜索模式包含大写字符,不使用‘ignorecase’选项。只有在输入搜索模式并且打开‘ignorecase’选项时才会使用setautowrite自动把内容写回文件也就是自动保存setautoindent设置自动对齐(缩进):即每行的缩进值与上一行相等;使用noautoindent取消设置setsmartind…

    2022年5月10日
    52
  • 14种DLL注入技术

    14种DLL注入技术本文只是介绍各个注入的核心思想,详细的可以参照文末链接里的源码,一看就明白。本文只是介绍各个注入的核心思想,详细的可以参照文末链接里的源码,一看就明白。本文只是介绍各个注入的核心思想,详细的可以参照文末链接里的源码,一看就明白。第一种CreateRemoteThread远程线程调用DLL注入是指向某一个特定的进程空间强制插入一个特定的DLL文件映像,值得注意的是这种插入是强制性的插…

    2022年5月13日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号