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');
/**
 * scripr start
 * async1 start
 * async2
 * promise1
 * scroptend
 * async1end
 * promise2
 * setimeout
 */

執行結果是否是和你想的有些不一樣?下面是我查閱資料後總結的同步任務和異步任務的執行順序promise

一、無論是同步仍是異步,js都會按順序執行,只是不等待異步的執行結果而已(並非遇到異步的就繞過不執行,別蒙了)異步

二、同步的任務沒有優先級之分,異步執行有優先級,先執行微任務(microtask隊列),再執行宏任務(macrotask隊列),同級別按順序執行async

  微任務: `process.nextTick` ,`promise` ,`MutationObserver`函數

  宏任務:`script` , `setTimeout` ,`setInterval` ,`setImmediate` ,`I/O` ,`UI rendering`spa

三、await表示讓出線程,繼續執行後面的函數(執行當前函數後面的函數,不是當前函數裏面的)線程

相關文章
相關標籤/搜索