Macrotasks 和 Microtasks

基本知識

  1. 棧:先進後出
    函數a調用函數b,b調用函數c。執行函數a,a入棧,a調用b, b入棧, b調用c,c入棧,c執行,返回結果,彈出棧,依次類推,最後a出棧 === 》先進後出
  2. 指針:當函數執行完畢後數組

    • 基本數據類型會從 stack 中彈出
    • 對象、數組的值是存在於 heap(堆) 中的,stack 只彈出指針了他們對應的指針。而真正的值依然存在 heap 中,而後由垃圾回收器自動的清理回收。
  3. 異步任務是由瀏覽器執行的。當任務執行完以後,瀏覽器會將任務執行的結果和實現定義的回調函數放入主線程中。因此當主線程任務阻塞的時候,任務隊列仍是能夠正常進行的。

macro tasks 和 micro tasks 分類

沒有找到很官方的定義,這個與瀏覽器引擎相關,看瀏覽器引擎怎麼定義任務的分類,如下是比較廣泛的分類
  1. macro tasks: 定時器、http、IO操做(setTimeout, setInterval, setImmediate, I/O, UI rendering)
  2. micro tasks: process.nextTick, Promises, Object.observe(廢棄), MutationObserver

執行順序

在同一輪執行中,micro tasks優先級比macro tasks高
  1. 在執行同步任務過程當中,碰到了macro tasks或者micro tasks,將其放入相對應的棧中。
  2. 先將全部的同步任務執行完
  3. 查看micro tasks,裏面是否有任務,有的話,執行完全部的任務。
  4. micro tasks執行事後,查看macro tasks,查看裏面是否有任務,若是有,執行第一個放入的任務。
  5. micro tasks執行完一個後,重複步驟1,2,3,4。
相關文章
相關標籤/搜索