async和await的讲解
声明async函数的几个方法
普通的函数声明
async function a(){
}
声明一个函数表达式
let a=async function(){
}
async形式的箭头函数
let a=async ()=>{
}
初识async和await
async与await实例应用,基础代码
控制器调用与server中查询数据
exports.getbloglist =async (ctx,next)=>{
return ctx.body = await articleserver.getbloglistserver();
}
exports.getbloglistserver= async ()=>{
let where={
id:'1'
}
let bloglist= await articleblogda.findall({
where:where});
console.log("哈哈哈" bloglist);
return bloglist;
}
1.方法执行后的返回值:await命令后面对应的是promise对象或值,如果是值,就会转到一个立即resolve
的promise对象。asyn
c函数返回的是一个promise对象,如果结果是值,会经过promise包装返回。
2.await
与并行:如果在一个async的方法中,有多个await
操作的时候,程序会变成完全的串行操作,一个完事等另一个但是为了发挥node的异步优势,当异步操作之间不存在结果的依赖关系时,可以使用promise.all来实现并行,all中的所有方法是一同执行的。
.3执行后的结果:async
函数中,如果有多个await
关键字时,如果有一个await
的状态变成了rejected
,那么后面的操作都不会继续执行,promise
也是同理await
的返回结果就是后面promise
执行的结果,可能是resolves
或者rejected
的值使用场景循环遍历方便了代码需要同步的操作(文件读取,数据库操作等)
async
与await
一些注意关键点小结
- await关键字必须位于async函数内部await关键字后面需要一个promise对象(不是的话就调用resolve转换它)
- await关键字的返回结果就是其后面promise执行的结果,可能是resolved或者rejected的值,注意最后执行完的是个值。
- 不能在普通箭头函数中使用await关键字,需要在箭头函数前面添加asyn
- cawait用来串行的执行异步操作,现实现并行可以考虑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
。