1、Async是异步的简写,await是asyncwait的简写,async是用于声明一个function是异步的,所以await用于等待一个异步方法执行
2、Async函数返回的是一个promise对象,await等待的是async函数的返回值,所以await等待的也是promise对象,而且也可是普通函数调用(await是运算符,用于组成表达式)如果await等到promise对象,await会阻塞后面代码,然后promise对象resolve后,得到值,这就是await的运算结果
3、Async函数调用不会造成阻塞,所以await必须在async函数中,内部所有的阻塞都封装在promise对象中执行
async与await一些注意关键点小结
- await关键字必须位于async函数内部
- await关键字后面需要一个promise对象(不是的话就调用resolve转换它)
- await关键字的返回结果就是其后面Promise执行的结果,可能是resolved或者rejected的值,注意最后执行完的是个值。
- 不能在普通箭头函数中使用await关键字,需要在箭头函数前面添加async
- await用来串行的执行异步操作,现实现并行可以考虑promise.all
async与await缺点
async函数中,如果有多个await关键字时,如果有一个await的状态变成了rejected,那么后面的操作都不会继续执行,promise也是同理有这样一个函数async
function getData(){
let value=await get();
value++;
await set();//set完成后返回数据
return value;
}
直接调用
var value=getData();
是对于这个函数直接调用的时候并不是你想要的返回值,因为async方法返回的永远是一个promise,即使开发者返回的是一个常量,也会被自动调用的promise.resolve方法转换为一个promise。因此对于这种情况,上层调用方法也需要是async函数,采用如下方法
async function xxxx(){
var value=await getData();
return value;
}
对于这种调用,如果还存在更高层次的方法调用,那么从底层的异步操作开始,一直到最顶层一个不需要返回值的函数为止,全部的方法都要变成async