对于async await的理解:
带 async 关键字的函数,它使得你的函数的返回值必定是 promise 对象。如果async关键字函数返回的不是promise,会自动用Promise.resolve()包装;如果async关键字函数显式地返回promise,那就以你返回的promise为准。
特点:async表示函数内部有异步操作,一般 await 关键字要在 async 关键字函数的内部,await 写在外面会报错。
对于 await 右侧表达式,如果不是 promise , await会阻塞后面的代码,先执行async外面的同步代码,同步代码执行完,再回到async内部,把这个非promise的东西,作为 await表达式的结果。
如果它等到的是一个 promise 对象,await 也会暂停async后面的代码,先执行async外面的同步代码,等着 Promise 对象 fulfilled,然后把 resolve 的参数作为 await 表达式的运算结果。
看例子:
async function async1() { console.log('async1 start') // async1 start 22 await async2(); console.log('async1 end') // async1 end 66 } async function async2() { console.log('async2'); //async2 33 } console.log('script start') //script start 11 setTimeout(function() { console.log('setTimeout'); //setTimeout 88 }, 0); async1(); new Promise(function(resolve) { console.log('promise1'); // promise1 44 resolve(); }).then(function() { console.log("promise2") //promise2 77 }); console.log("script end"); // script end 55
截图后面注释的数字代表打印出来的先后顺序,11代表第一,22代表第二。
除此之外还涉及到宏任务和微任务。下次再聊。