如何理解 JS 非同步程式設計的,EventLoop、訊息佇列,什麼是巨集任務,什麼是微任務?
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 環境)等
謝謝觀看,如有不足,敬請指教
相關文章
- JS中EventLoop、巨集任務與微任務的個人理解JSOOP
- 任務佇列,巨集任務與微任務佇列
- 總結:JavaScript非同步、事件迴圈與訊息佇列、微任務與巨集任務JavaScript非同步事件佇列
- 什麼是訊息佇列?佇列
- js的setTimeout和Promise—同步非同步和微任務巨集任務JSPromise非同步
- javascript事件環微任務和巨集任務佇列原理JavaScript事件佇列
- 什麼是訊息佇列啊?佇列
- js中的巨集任務和微任務JS
- 大量佇列任務總是 MaxAttemptsExceededException,怎麼辦?佇列Exception
- 巨集任務和微任務
- [原始碼解析] 並行分散式任務佇列 Celery 之 Task是什麼原始碼並行分散式佇列
- 微任務和宏任務有什麼區別?
- 關於非同步方法中的巨集任務與微任務非同步
- JavaScript的巨集任務與微任務JavaScript
- JavaScript巨集任務和微任務JavaScript
- 淺談JS阻塞方式怎麼實現非同步任務佇列?JS非同步佇列
- 前端急速解決非同步之微任務和巨集任務前端非同步
- Event Loop、 巨集任務和微任務OOP
- js定時任務佇列JS佇列
- 瞭解js執行機制——微任務與巨集任務JS
- JavaScript有同步任務和非同步任務,瀏覽器是怎麼處理的?JavaScript非同步瀏覽器
- 微任務、巨集任務與Event-LoopOOP
- macrotask 巨集任務 + microtask 微任務區別Mac
- JS事件迴圈機制(event loop)之巨集任務/微任務JS事件OOP
- 詳解JavaScript的任務、微任務、佇列以及程式碼執行順序JavaScript佇列
- 分散式任務 + 訊息佇列框架 go-queue分散式佇列框架Go
- RabbitMQ訊息佇列(三):任務分發機制MQ佇列
- 【Interview】什麼是AQS佇列同步器ViewAQS佇列
- 訊息佇列之事務訊息,RocketMQ 和 Kafka 是如何做的?佇列MQKafka
- Celery任務佇列佇列
- 佇列Queue:任務間的訊息讀寫,安排起來~佇列
- 企業數字化轉型的核心任務是什麼?
- 什麼是專案管理中的任務依賴關係專案管理
- 微任務和巨集任務哪個先執行
- 基於訊息佇列(RabbitMQ)實現延遲任務佇列MQ
- 什麼是物件?什麼是抽象?怎麼理解物件導向的程式設計思想?物件抽象程式設計
- 如何寫一個任務佇列佇列
- 《RabbitMQ》什麼是死信佇列MQ佇列