一、Async作用
异步函数async/await让js异步编程彻底的人性化。js异步编程从最初的异步回调嵌套,到promise的链式回调,再发展到一行一行的编写,更简洁,符合人的习惯性思维。
二、async函数与promise的关系
async和promise相辅相成,搭配起来很好用。
三、async函数用法
异步函数中,可以不用await。async函数调用后会返回一个promise实例:
1、如果return一个普通值,异步函数会将其封装成一个fulfilled状态的promise。
2、如果抛出异常,则返回一个rejected的promise
3、return一个promise,则直接返回该对象
四、async/await用法
async表示函数中可能有异步操作,可以使用await关键字(在普通函数中使用await会报错)
await相当于promise的then方法,后面可以跟一个异步函数,一个promise,也可以跟一个普通值。
function fetchData(){
return new Promise((resolve)=>{
setTimeout(resolve,2000)
})
}
async myAsyncFoo(){
let res = await fetchData() // 返回一个promise;
console.log(res)
}
myAsyncFoo()
五、async函数中使用try/catch来代替promise.catch方法
如果await 后面跟的是rejected态的promise,js引擎会报错抛出异常,并终止后面代码执行。
这时可以用try/catch来捕获异常
async function foo (){
return Promise.reject('reject')
}
async function myAsyncFoo (){
try{
let res = await foo()
}catch(err){
console.log('error caught' + err)
}
}
myAsyncFoo()
六、async函数异步的本质
1、async函数体中,可以写同步代码,await 后面的语句相当于异步回调
async function foo2(){
console.log('async2') // 同步代码
}
async function foo1(){
console.log('async1 start') // 同步代码,立即执行
await foo2(); // await后面跟着函数的话,会立同步执行
//await 下面代码相当于异步回调
console.log('async2 end') // 此部分是异步回调
await foo3()
console.log('async3 end')
}
async function foo3(){
console.log('async3')
}
console.log('script start')
foo1()
console.log('script end') // 同步代码执行完,开始启动event loop机制。