因为这个方法是async方法,所以在这个方法里可以使用await。

image.png

在async/await之前,我们有三种方式写异步代码

  1. 嵌套回调
  2. 以Promise为主的链式回调
  3. 使用Generators

但是,这三种写起来都不够优雅,ES7做了优化改进,async/await应运而生,async/await相比较Promise 对象then 函数的嵌套, Async/Await 可以让你轻松写出同步风格的代码同时又拥有异步机制,更加简洁,逻辑更加清晰。

async/await特点

  1. async/await更加语义化,async 是“异步”的简写,async function 用于申明一个 function 是异步的; await,可以认为是async wait的简写, 用于等待一个异步方法执行完成;
  2. async/await是一个用同步思维解决异步问题的方案(等结果出来之后,代码才会继续往下执行)
  3. 可以通过多层 async function 的同步写法代替传统的callback嵌套

async function语法

  • 自动将常规函数转换成Promise,返回值也是一个Promise对象
  • 只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数
  • 异步函数内部可以使用await

await语法

  • await 放置在Promise调用之前,await 强制后面点代码等待,直到Promise对象resolve,得到resolve的值作为await表达式的运算结果
  • await只能在async函数内部使用,用在普通函数里就会报错

错误处理

在async函数里,无论是Promise reject的数据还是逻辑报错,都会被默默吞掉,所以最好把await放入try{}catch{}中,catch能够捕捉到Promise对象rejected的数据或者抛出的异常

使用场景

多个await命令的异步操作,如果不存在依赖关系(后面的await不依赖前一个await返回的结果),用Promise.all()让它们同时触发