# ES6之async/await
如果要使一个函数变成async/await的形式,必须要做两步:
1、直接在普通函数前面加上async,表示这是一个异步函数 (任何普通函数可以调用async函数, 结果.then)
2、在函数内部 的异步执行的语句前面加上await (后面可以跟promise或者任意类型的值)
# 1、async的多种声明形式
//函数式声明
async function test() {}
//对象式声明
let obj = {
async test() {}
};
//箭头函数声明
let test = async () => { }
# 2、await语句的多种调用形式
//普通语句,首先await a;的表达式的值为a的值,然后再转成一个resolve的promise对象
async function f() {
await 123; //值为123
let a = await "hello"; //a的值为“hello”
return a;
}
//promise语句。(1)如果是resolve的。则直接返回resolve中的数据
getPromise() {
return new Promise((resolve, reject) => {
resolve("world");
});
}
async getName() {
let p = await this.getPromise(); //p为resolve的promise对象,值为“world”
return p;
},
//promise语句。(2)如果是reject的。则直接返回reject中的数据
getPromise() {
return new Promise((resolve, reject) => {
reject(new Error("错误了"));
});
}
async getName() {
let p = await this.getPromise(); //p为reject的promise对象,值为“错误了”,后面的语句不会再执行
//to do
return p;
},
此时要么在async部分捕获错误,并进行处理。要么在调用async语句的地方捕获错误并处理
# 3、await语错误处理
//单条语句的处理
async getName() {
let str = "";
await this.getPromise().catch(err => {
str = "world";
});
return str;
}
//多条语句的处理
async getName() {
let str = "";
try {
await this.getPromise();
await 123;
} catch (err) {
str = "world1";
}
return str;
}
# 4、await的并行处理
//因为多个await都是依次往后台发送。如果这几个请求之前没有先后关联顺序,则完全没必要。可以做成并行发送
async getName() {
let str = "";
await Promise.all([this.getPromise(),this.getPromise(),this.getPromise()]);
return str;
},