ES7 Async/Await快速入门

用法:

使用async 声明函数,在async函数内使用await

async function xxx(){
  await [表达式1]
  await [表达式2]
  //.....
}

await可以跟普通的表达式和值,但是这么做毫无意义
async function gogogo(){
  let a = 1
  a = await 2
  console.log(a)
}
gogogo();
ES7 Async/Await快速入门_第1张图片
在await后面跟Promise对象,才是其真正的用法:
function thePromise(){
  return new Promise(resolve=>{
    setTimeout(()=>{
      resolve('异步完成')
    },1000)
  })
}
async function gogogo(){
  let a = 1
  a = await thePromise() // 异步完成
  console.log(a)
}
gogogo(); //像普通函数一样调用
ES7 Async/Await快速入门_第2张图片
说明:await 会输出Promise对象resolve/reject后的值,只有Promise被resolve/reject之后,async函数才会往下走
如果调用了then,await输出then返回的值
function thePromise(){
  return new Promise(resolve=>{
    setTimeout(()=>{
      resolve('异步完成')
    },1000)
  }).then(resolve=>{
    return '真的完成了!'
  })
}
ES7 Async/Await快速入门_第3张图片

进阶:thenable对象

试想看这样一段代码,val的值是什么?

const thenable = {
        then (resolve) {
            resolve(666)
        }
}
async function go () {
    const val = await thenable
    console.log(val)
}

go()

答案是 666
如果一个对象包含有then方法,则称其为thenable对象,await碰到了thenable则会调用其then方法并传入resolve,reject回调,then函数中调用者2个对调改变这个thenable的状态(fullfiled/rejected),效果等同于Promise实例。

所以,可以在then函数中第二个参数,把thenable对象变成rejected

const thenable = {
        then (resolve, reject) {
            reject(666)
        }
}
async function go () {
   try {
      await thenable
    } catch (e) {
      console.error('拒绝',e) // '拒绝', 666
    }
}

go()
总结:async函数帮助我们用同步的方式编写异步代码,本质上是generator函数的语法糖
提醒:await的异步任务时按顺序进行的,如果你不需要按顺序获取异步的结果,可以使用await Promise.all或await Promise.race等方法让多个异步同时进行

你可能感兴趣的:(ES7 Async/Await快速入门)