一、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,也可以跟一个普通值。

    1. function fetchData(){
    2. return new Promise((resolve)=>{
    3. setTimeout(resolve,2000)
    4. })
    5. }
    6. async myAsyncFoo(){
    7. let res = await fetchData() // 返回一个promise;
    8. console.log(res)
    9. }
    10. myAsyncFoo()

    五、async函数中使用try/catch代替promise.catch方法
    如果await 后面跟的是rejected态的promise,js引擎会报错抛出异常,并终止后面代码执行。
    这时可以用try/catch来捕获异常

    1. async function foo (){
    2. return Promise.reject('reject')
    3. }
    4. async function myAsyncFoo (){
    5. try{
    6. let res = await foo()
    7. }catch(err){
    8. console.log('error caught' + err)
    9. }
    10. }
    11. myAsyncFoo()

    六、async函数异步的本质
    1、async函数体中,可以写同步代码,await 后面的语句相当于异步回调

    1. async function foo2(){
    2. console.log('async2') // 同步代码
    3. }
    4. async function foo1(){
    5. console.log('async1 start') // 同步代码,立即执行
    6. await foo2(); // await后面跟着函数的话,会立同步执行
    7. //await 下面代码相当于异步回调
    8. console.log('async2 end') // 此部分是异步回调
    9. await foo3()
    10. console.log('async3 end')
    11. }
    12. async function foo3(){
    13. console.log('async3')
    14. }
    15. console.log('script start')
    16. foo1()
    17. console.log('script end') // 同步代码执行完,开始启动event loop机制。