async / await 是ES7提出的基于Promise的解决异步的最终方案。
一、async
async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。
async function sum() {
console.log(1);
return 2;
}
sum().then((res) => {
console.log(res);
}); //换行输出:1 2
async function sum1() {
console.log("promise");
return new Promise(function (resolve, reject) {
resolve("111");
});
}
sum1().then((res) => {
console.log(res);
}); //换行输出:promise 111
二、await
await 也是一个修饰符,只能放在async定义的函数内。
await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),且取到值后语句才会往下执行;
如果不是Promise对象:把这个非promise的东西当做await表达式的结果。
async function fun() {
let a = await 111;
let b = await new Promise((resolve, reject) => {
setTimeout(function () {
resolve("222");
}, 3000);
});
let c = await (function () {
return "333";
})();
console.log(a, b, c);
}
fun(); // 输出结果: 1 (3秒后输出) "222" "333"
- 如果 Promise 有一个正常的返回值,await 语句也会返回它:
async function fun1() {
let value = await new Promise(function (resolve, reject) {
resolve("Return value");
});
console.log(value);
}
fun1(); //输出:Return value
三、async 基本错误处理
async function add() {
// console.log(x);//未定义变量
throw new Error("fail");//手动抛出错误
}
add().catch((error) => {
console.log(error);
});
四、await 错误处理
处理异常的机制将用 try-catch 块实现。
async function sum() {
try {
await new Promise(function (resolve, reject) {
// throw new Error("error");
throw "some error"; // 或者 reject("error")
console.log("111"); //错误未处理不执行
});
} catch (err) {
console.log(err);
}
console.log("错误已处理"); //错误已处理,执行
}
sum();