如何理解 JS 非同步程式設計的,EventLoop、訊息佇列,什麼是巨集任務,什麼是微任務?

ZhandsomeZ發表於2020-10-01

在這裡插入圖片描述

JS 非同步程式設計
JavaScript 語言的執行環境是單執行緒的,一次只能執行一個任務,多工需要排隊等候,這種模式可能會阻塞程式碼,導致程式碼執行效率低下。

為了避免這個問題,出現了非同步程式設計。一般是通過 callback 回撥函式、事件釋出/訂閱、Promise 等來組織程式碼,

本質都是通過回撥函式來實現非同步程式碼的存放與執行。
EventLoop 事件環和訊息佇列
EventLoop:是一種迴圈機制 ,不斷去輪詢一些佇列 ,從中找到 需要執行的任務並按順序執行的一個執行模型。

訊息佇列:是用來存放巨集任務的佇列, 比如定時器時間到了, 定時間內傳入的方法引用會存到該佇列, 

ajax回撥之後的執行方法也會存到該佇列。

一開始整個指令碼作為一個巨集任務執行。執行過程中同步程式碼直接執行,巨集任務等待時間到達或者成功後,

將方法的回撥放入巨集任務佇列中,微任務進入微任務佇列。

當前主執行緒的巨集任務執行完出隊,檢查並清空微任務佇列。接著執行瀏覽器 UI 執行緒的渲染工作,檢查web worker 任務,有則執行。

然後再取出一個巨集任務執行。以此迴圈...
巨集任務
巨集任務可以理解為每次執行棧執行的程式碼就是一個巨集任務(包括每次從事件佇列中獲取一個事件回撥並放到執行棧中執行)。

瀏覽器為了讓 JS 內部巨集任務 與 DOM 操作能夠有序的執行,會在一個巨集任務執行結束後,

在下一個巨集任務執行開始前,對頁面進行重新渲染。

巨集任務包含:script(整體程式碼)、setTimeout、setInterval、I/O、UI互動事件、MessageChannel 等
微任務
可以理解是在當前任務執行結束後需要立即執行的任務。也就是說,在當前任務後,在渲染之前,執行清空微任務。

所以它的響應速度相比巨集任務會更快,因為無需等待 UI 渲染。

微任務包含:Promise.then、MutaionObserver、process.nextTick(Node.js 環境)

謝謝觀看,如有不足,敬請指教

相關文章