async是Generator 函数的语法糖。(所谓的语法糖就是用更简单的语法去代替发咋的语法,不会改变其功能但是却更加容易使用),所谓的async就是几部的意思,配合await使用,await表示等待。
- 语法:使用async关键字声明,只要在一个函数前面添加关键字async,就回生命这个函数为异步函数,会异步执行的。
- 返回值:使用async声明的函数会改变其返回值呢,他不会再返回return返回的值了,而是把return返回的值通过promise.resolved()封装成一个promise对象返回。那么返回值有什么用呢,这个返回值尽管转换成promise对象了,但是也回座位参数传递给then()方法。
- await关键字:其实如果没有await关键字,async看起来平平淡淡的只是把函数的返回值封装成promise对象了。其主要作用的其实是增加了await之后,await语义等待,那么他在等待什么呢??
- 首先要明确,await关键字只能出现在async声明的函数中
- await只有等到了其后面的函数或者表达式的返回结果才会执行其下面的语句,有阻塞语句的作用呢(要的就是这种效果,因为有些时候我们需要等到上面的结果才能运行下面的分支)
- 对于Promise对象,await会阻塞主函数的执行,等待 Promise 对象 resolve,然后得到 resolve 的值,作为 await 表达式的运算结果,然后继续执行主函数接下来的代码。
- 对于非Promise对象,await等待函数或者直接量的返回,而不是等待其执行结果
- 应用场景:上面说到,await可以阻塞主函数,直到后面的Promise对象执行完成。这个特性就能很轻松的解决按顺序控制异步操作,即我们前一章节讲的异步流程的问题。
//准备
function prepare(){
return new Promise((resolve) => {
setTimeout(function(){
console.log("prepare chicken");
resolve();
},500)
});
}
//炒鸡
function fired(){
return new Promise((resolve) => {
setTimeout(function(){
console.log("fired chicken");
resolve();
},500)
});
}
//炖鸡
function stewed(){
return new Promise((resolve) => {
setTimeout(function(){
console.log("stewed chicken");
resolve();
},500)
});
}
//上料
function sdd(){
return new Promise((resolve) => {
setTimeout(function(){
console.log("sdd chicken");
resolve();
},500)
});
}
//上菜
function serve(){
return new Promise((resolve) => {
setTimeout(function(){
console.log("serve chicken");
resolve();
},500)
});
}
async function task(){
console.log("start task");
await prepare();
await fired();
await stewed();
await sdd();
await serve();
console.log("end task");
}
task();
-
总结:
1、首先每个制作异步过程封装成Promise对象。
2、利用await阻塞原理,实现每个制作的顺序执行。