亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

js的settimeout方法 settimeout函數用法( 三 )


通過結果可以看出,雖然我們先調用的asyncFunc,雖然asyncFunc寫的是2秒后執(zhí)行,但是syncFunc的執(zhí)行時間太長,達到了5秒,asyncFunc雖然在2秒的時候就已經進入了事件隊列,但是主線程一直在執(zhí)行同步代碼,一直沒空,所以也要等到5秒后,同步代碼執(zhí)行完畢才有機會執(zhí)行這個定時器回調 。所以再次強調,寫代碼時一定不要長時間占用主線程 。
引入微任務前面的流程圖我為了便于理解,簡化了事件隊列,其實事件隊列里面的事件還可以分兩類:宏任務和微任務 。微任務擁有更高的優(yōu)先級,當事件循環(huán)遍歷隊列時,先檢查微任務隊列,如果里面有任務,就全部拿來執(zhí)行,執(zhí)行完之后再執(zhí)行一個宏任務 。執(zhí)行每個宏任務之前都要檢查下微任務隊列是否有任務,如果有,優(yōu)先執(zhí)行微任務隊列 。所以完整的流程圖如下:
上圖需要注意以下幾點:
一個Event Loop可以有一個或多個事件隊列,但是只有一個微任務隊列 。微任務隊列全部執(zhí)行完會重新渲染一次每個宏任務執(zhí)行完都會重新渲染一次requestAnimationFrame處于渲染階段,不在微任務隊列,也不在宏任務隊列
所以想要知道一個異步API在哪個階段執(zhí)行,我們得知道他是宏任務還是微任務 。
常見宏任務有:
script (可以理解為外層同步代碼)setTimeout/setIntervalsetImmediate(Node.js)I/OUI事件postMessage
常見微任務有:
Promiseprocess.nextTick(Node.js)Object.observeMutaionObserver
上面這些事件類型中要注意Promise,他是微任務,也就是說他會在定時器前面運行,我們來看個例子:
console.log('1');setTimeout(() => {console.log('2');},0);Promise.resolve().then(() => {console.log('5');})new Promise((resolve) => {console.log('3');resolve();}).then(() => {console.log('4');})上述代碼的輸出是1,3,5,4,2 。因為:
先輸出1,這個沒什么說的,同步代碼最先執(zhí)行console.log(‘2’);在setTimeout里面,setTimeout是宏任務,“2”進入宏任務隊列console.log(‘5’);在Promise.then里面,進入微任務隊列console.log(‘3’);在Promise構造函數的參數里面,這其實是同步代碼,直接輸出console.log(‘4’);在then里面,他會進入微任務隊列,檢查事件隊列時先執(zhí)行微任務同步代碼運行結果是“1,3”然后檢查微任務隊列,輸出“5,4”最后執(zhí)行宏任務隊列,輸出“2”
Node.js的Event LoopNode.js是運行在服務端的js,雖然他也用到了V8引擎,但是他的服務目的和環(huán)境不同,導致了他API與原生JS有些區(qū)別,他的Event Loop還要處理一些I/O,比如新的網絡連接等,所以與瀏覽器Event Loop也是不一樣的 。Node的Event Loop是分階段的,如下圖所示:
timers: 執(zhí)行setTimeout和setInterval的回調pending callbacks: 執(zhí)行延遲到下一個循環(huán)迭代的 I/O 回調idle, prepare: 僅系統內部使用poll: 檢索新的 I/O 事件;執(zhí)行與 I/O 相關的回調 。事實上除了其他幾個階段處理的事情,其他幾乎所有的異步都在這個階段處理 。check: setImmediate在這里執(zhí)行close callbacks: 一些關閉的回調函數,如:socket.on(‘close’, …)
每個階段都有一個自己的先進先出的隊列,只有當這個隊列的事件執(zhí)行完或者達到該階段的上限時,才會進入下一個階段 。在每次事件循環(huán)之間,Node.js都會檢查它是否在等待任何一個I/O或者定時器,如果沒有的話,程序就關閉退出了 。我們的直觀感受就是,如果一個Node程序只有同步代碼,你在控制臺運行完后,他就自己退出了 。
還有個需要注意的是poll階段,他后面并不一定每次都是check階段,poll隊列執(zhí)行完后,如果沒有setImmediate但是有定時器到期,他會繞回去執(zhí)行定時器階段:


以上關于本文的內容,僅作參考!溫馨提示:如遇健康、疾病相關的問題,請您及時就醫(yī)或請專業(yè)人士給予相關指導!

「愛刨根生活網」www.malaban59.cn小編還為您精選了以下內容,希望對您有所幫助: