说明 : 要了解执行顺序,所需要的知识是了解浏览器js运行机制,以及微任务和宏任务的先后顺序。如果你明白了宏任务、微任务,请往下看:
async function async1 () { console.log('async1 start') await async2(); // 重点 console.log('async1 end') } async function async2 () { console.log('async2') } console.log('script start') setTimeout(function () { console.log('setTimeout') }, 0) async1(); new Promise (function (resolve) { console.log('promise1') resolve(); }).then (function () { console.log('promise2') }) console.log('script end')
首先根据大家常规理解,异步的先放一放 : 很容易得出 :先执行 console.log('script start') ,然后执行async1()的结论。
重点分析async1() : 执行 console.log('async1 start'); 执行 await async2(); 运行到await就要注意了,下面的代码会先放一放,会让出线程所以继续执行主线程new Promise和console.log('end');当前线程执行完后返回await继续下面执行 console.log('async1 end'),然后执行微任务then,最后执行宏任务setTimeout,所以...
‘script start’
'async1 start'
‘async2’
‘promise1’
‘script end’
‘async1 end’
‘promise2’
‘setTimeout’