先來道今日頭條面試題開開胃面試
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');
執行結果是否是和你想的有些不一樣?下面是我查閱資料後總結的同步任務和異步任務的執行順序promise
一、無論是同步仍是異步,js都會按順序執行,只是不等待異步的執行結果而已(並非遇到異步的就繞過不執行,別蒙了)異步
二、同步的任務沒有優先級之分,異步執行有優先級,先執行微任務(microtask隊列),再執行宏任務(macrotask隊列),同級別按順序執行async
微任務: `process.nextTick` ,`promise` ,`MutationObserver`函數
宏任務:`script` , `setTimeout` ,`setInterval` ,`setImmediate` ,`I/O` ,`UI rendering`spa
三、await表示讓出線程,繼續執行後面的函數(執行當前函數後面的函數,不是當前函數裏面的)線程