js事件輪詢機(jī)制

這段代碼的執(zhí)行順序,根據(jù)執(zhí)行順序分析、JS事件輪詢?cè)?/h4>
 console.log('script start');     // 1       
 setTimeout(function () {
      console.log('settimeout')               // 6           
 });
let promise1 = new Promise(function (resolve) {
    console.log('promise1')            // 2
    resolve()
    console.log('promise1 end')          // 3 
}).then(function () { 
    console.log('promise2')                // 5     
});
console.log('script end');             // 4         

執(zhí)行邏輯

  • 從代碼執(zhí)行角度來看 首先分析同步代碼、在面的代碼中異步代碼只有promise.then回調(diào)與settimeout回調(diào),所以他們肯定是最后執(zhí)行的、其他同步代碼按照書寫順序自上向下執(zhí)行
  • promise.then回調(diào)雖然是異步執(zhí)行,但是resolve()觸發(fā)后實(shí)際上回調(diào)函數(shù)被加入到了js同步函數(shù)隊(duì)列末尾,在輪詢過程中仍然會(huì)作為同步代碼優(yōu)先執(zhí)行
  • settimeout定時(shí)器在js中是由一個(gè)單獨(dú)模塊管理、其回調(diào)函數(shù)也是由一個(gè)單獨(dú)隊(duì)列管理,在js同步隊(duì)列執(zhí)行完畢,才會(huì)執(zhí)行定時(shí)器隊(duì)列代碼

結(jié)論

  • 在js中代碼的執(zhí)行實(shí)際上是由兩個(gè)隊(duì)列來組織代碼執(zhí)行時(shí)序的(主線程隊(duì)列、定時(shí)器隊(duì)列),優(yōu)先輪詢主線程隊(duì)列、主線程隊(duì)列空閑輪詢定時(shí)器隊(duì)列。
  • 實(shí)際上我們?nèi)执a也在一個(gè)全局函數(shù)中,此函數(shù)在js解釋器開始工作時(shí),總是排在主線程隊(duì)列頭部。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容