async和await
async
async 是“异步”的简写, async 用于申明一个异步的 function
await
await 可以认为是 async wait 的简写,await 用于等待一个异步方法执行完成。
特点:
1.sayc的用法,它作为一个关键字放到函数前面,这样普通函数就变为了异步函数
2.异步async函数调用,跟普通函数的使用方式一样
3.异步async函数返回一个promise对象
4.async函数配合await关键字使用(阻塞代码往下执行)是异步方法,但是阻塞式的
async/await的优点
1.同步代码编写方式: Promise使用then函数进行链式调用,async/await从上到下,顺序执行,就像写同步代码一样,更符合代码编写习惯;
2.多个参数传递: Promise的then函数只能传递一个参数,async可以同时传递多个参数
3.同步代码和异步代码可以一起编写:当然,异步过程需要包装成一个Promise对象放在await关键字后面;
4.sync/await是对Promise的优化: async/await是基于Promise的,是进一步的一种优化,不过在写代码时,Promise本身的API出现得很少,很接近同步代码的写法;
使用场景
async主要来处理异步的操作,
需求:执行第一步,将执行第一步的结果返回给第二步使用。在ajax中先拿到一个接口的返回数据,后使用第一部返回的数据执行第二步操作的接口调用,达到异步操作。
async/ await案例:
首先把 getFaceResult 转化成一个async 函数,就是在其前面加async, 因为它的调用方法和普通函数的调用方法是一致,所以没有什么问题。然后就把 getLocation 和getFaceList 放到await 后面,等待执行, getFaceResult 函数修改如下:
async getFaceResult () {
let location = await this.getLocation(this.phoneNum);
if (location.data.success) {
let province = location.data.obj.province;
let city = location.data.obj.city;
let result = await this.getFaceList(province, city);
if (result.data.success) {
this.faceList = result.data.obj;
}
}
}
现在代码的书写方式,就像写同步代码一样,没有回调的感觉,非常舒服。
现在就还差一点需要说明,那就是怎么处理异常,如果请求发生异常,怎么处理? 它用的是try/catch 来捕获异常,把await 放到 try 中进行执行,如有异常,就使用catch 进行处理。
async getFaceResult () {
try {
let location = await this.getLocation(this.phoneNum);
if (location.data.success) {
let province = location.data.obj.province;
let city = location.data.obj.city;
let result = await this.getFaceList(province, city);
if (result.data.success) {
this.faceList = result.data.obj;
}
}
} catch(err) {
console.log(err);
}
}