ReactNative进阶(三十六):ES6中async与await的使用方法详解
Posted No Silver Bullet
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReactNative进阶(三十六):ES6中async与await的使用方法详解相关的知识,希望对你有一定的参考价值。
一、前言
在前期博文中,针对异步编程,提出了Promise
解决方案。从语法上说,Promise
是一个对象,从它可以获取异步操作的消息,解决回调函数嵌套过多的情况。
ES2017
标准引入了 async
函数,使得异步操作变得更加方便。
async
是“异步”的简写,比如Ajax
中就有这个代表异步请求; 因为await
只能出现在async
函数中的语法规定,await
可以认为是 async wait
的简写。所以应该很好理解 async
用于申明一个 function
是异步的,而 await
用于等待一个异步方法执行完成。
二、async作用
async
函数返回的是一个 Promise
对象。async
函数(包含函数语句、函数表达式、Lambda
表达式)会返回一个 Promise
对象,如果在函数中 return
一个直接量,async
会把这个直接量通过 Promise.resolve()
封装成 Promise
对象。如下图所示:
很明显,async
函数返回的就是promise
对象。
那么在没有await
配合下,async
返回promise
对象,所以可以配合then
处理如下图:
返回同样结果,所以和promise
对象中then
用法一样的效果。回想一下 Promise
的特点——无等待,所以在没有 await
的情况下执行 async
函数,它会立即执行,并返回一个 Promise
对象,并且,绝不会阻塞后面的语句。这和普通返回 Promise
对象的函数并无二致。
三、await作用
await
是个运算符,用于组成表达式,await
表达式的运算结果取决于它等的东西。如果它等待的是一个 Promise
对象,等 Promise
对象 resolve
,然后得到 resolve
的值,作为 await
表达式的运算结果。sync
函数调用不会造成阻塞,它内部所有的阻塞都被封装在一个 Promise
对象中异步执行。
如果改用 async/await 呢,会是这样:
以上两段代码中,两种调用方式对异步调用的处理(实际就是对 Promise
对象的处理)差别并不明显,甚至使用 async/await
还需要多写一些代码,那它的优势到底在哪?
四、async/await 的优势在于处理 then 链
单一的 Promise
链并不能发现 async/await
的优势,但是,如果需要处理由多个 Promise
组成的 then
链的时候,优势就能体现出来了(Promise
通过 then
链来解决多层回调的问题,现在又用 async/await
来进一步优化它)。
假设一个业务流程,分多个步骤完成,每个步骤都是异步的,而且依赖于上一个步骤的结果。我们仍然用 setTimeout 来模拟异步操作:
Promise 方式处理异步
接下来用 async/await 来实现:
优化效果显而易见!
拓展阅读
以上是关于ReactNative进阶(三十六):ES6中async与await的使用方法详解的主要内容,如果未能解决你的问题,请参考以下文章
ReactNative进阶(三十九):DeviceEventEmitter 实现发送和监听消息
ReactNative进阶(三十七):应用SectionList实现分组列表
Python进阶(三十六)-Web框架Django项目搭建全过程
ReactNative进阶(三十一): IoC 框架 InversifyJS解读