async和await
async
函数前加上async代表是一个异步函数,默认情况下和普通函数一样都是同步执行的。
异步函数始终返回期约对象。
异步函数和普通函数的区别:
- 异步函数的返回值默认会被包裹在Promise.resolve中
- 如果我们的异步函数的返回值是Promise,Promise.resolve的状态会由Promise决定;
- 如果我们的异步函数的返回值是一个对象并且实现了thenable,那么会由对象的then方法来决定;
错误处理:
与在期约处理程序中一样,在异步函数中抛出错误会返回拒绝的期约。
但是拒绝期约的错误不会被异步函数捕获。
js
async function baz() {
Promise.reject("cuowu"); //Uncaught (in promise) cuowu
}
baz().catch(console.log);
await
只有异步函数中才可以使用await关键字。
await后面默认跟上的是一个表达式,表达式返回一个Promise,等到Promise的状态变为fulfiled时,继续执行异步函数。
await返回值有以下三种情况:
- 如果是一个普通的值,直接返回
- 如果是一个实现了thenable的对象,则会根据then方法来确定返回的值。
- 如果是一个Promise,并且Promsie返回reject,则rejiect会作为异步函数的reject进行返回。
异步函数中,单独的Promise.reject()不会被异步函数捕获,而会抛出未捕获的错误。
但是,对拒绝的期约使用await则会释放(unwrap)错误值。(将拒绝期约返回)
js
async function baz() {
console.log("start");
await Promise.reject("ccc");
}
baz().catch(console.log);
/*
start
ccc
*/