上图左为Generator的写法,右为async的写法,同为输出promise结果小程序
async函数返回一个 Promise 对象,可使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操做完成,再接着执行函数体内后面的语句。promise
上面代码是一个获取股票报价的函数,函数前面的async关键字,代表该函数内部有异步操做。调用该函数时,会当即返回一个Promise对象。异步
显然使用三个await是不合理的,既然await后能够跟跟promise,那么咱们可使用promise.all来知足此需求
复制代码
async函数返回一个promise对象async函数内部return返回的值,会成为then方法回调函数的参数async
上图代码中,函数f内部return命令返回的值,会被then方法回调函数接收到函数
async函数内部抛出错误,会致使返回的Promise对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到优化
async函数返回的 Promise 对象,必须等到内部全部await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操做执行完,才会执行then方法指定的回调函数。spa
上面代码中,函数getTitle内部有三个操做:抓取网页、取出文本、匹配页面标题。只有这三个操做所有完成,才会执行then方法里面的console.log。3d
正常状况下,await命令后面是一个 Promise 对象,返回该对象的结果。若是不是 Promise 对象,就直接返回对应的值。code
上面代码中,await命令的参数是数值123,这时等同于return 123。cdn
另外一种状况是,await命令后面是一个thenable对象(即定义then方法的对象),那么await会将其等同于 Promise 对象。
上面代码中,await命令后面是一个Sleep对象的实例。这个实例不是 Promise 对象,可是由于定义了then方法,await会将其视为Promise处理。
下面这个例子演示了如何实现休眠效果。JavaScript 一直没有休眠的语法,可是借助await命令就可让程序停顿指定的时间。下面给出了一个简化的sleep实现。
await命令后面的 Promise 对象若是变为reject状态,则reject的参数会被catch方法的回调函数接收到。
! 注意!任何一个await语句后面的 Promise 对象变为reject状态,那么整个async函数都会中断执行。
若是任意一个await后面的异步操做出错,那么等同于async函数返回的 Promise 对象被reject。 为了防止此类状况发生,可使用try...catch作异常处理
场景描述:检索用户,若用户已借绘本大于5本,押金小于100元则依次弹出提醒弹窗(需用户手动点击才可关闭弹窗)
上图为代码实现
场景描述:输入手机号,获取验证码,校验手机是否登陆,登陆系统
未优化版本
优化版本
async 函数的实现原理,就是将 Generator 函数和自动执行器,包装在一个函数里。