1. 程式人生 > >同步任務、非同步任務、巨集任務、微任務基本概念

同步任務、非同步任務、巨集任務、微任務基本概念

同步任務: 指的是在主執行緒傻姑娘排隊執行的任務,只有前一個任務執行完畢,才能執行後一個任務。 非同步任務: 指的是不進入主執行緒,某個非同步任務可以執行了,該任務才會進入主執行緒執行。

非同步執行的執行機制如下(同步任務也如此,因為它可以被視為沒有非同步任務的非同步執行):
  1. 所有同步任務都在主執行緒上執行,形成一個執行棧(execution context stack)
  2. 主執行緒之外,還存在一個“任務佇列”,只要非同步任務有了執行結果,就在“任務佇列”之中放置一個事件
  3. 一旦“執行棧”中的所有同步任務執行完畢,系統就會讀取“任務佇列”,看看裡面有哪些事件。那些對應的非同步任務,於是結束等待,進入執行棧,開始執行
  4. 主執行緒不斷重複第3步 主執行緒和任務佇列的示意圖

javascript提供的與“任務佇列”有關的方法有:setTimeout、setInterval、process.nextTick和setImmediate。

process.nextTick方法可以在當前“執行棧”的尾部——下一次Event Loop(主執行緒讀取“任務佇列”)之前——觸發回撥函式。也就是說,它指定的任務總是發生在所有非同步任務之前。 setImmediate方法則是在當前“任務佇列”的尾部新增事件,也即是說,它指定的任務總是在下一次Event Loop時執行。

內容來自阮一峰部落格

巨集任務macrotask: 可以理解是每次執行棧執行的程式碼就是一個巨集任務(包括每次從事件佇列中獲取一個事件回撥並放到執行棧中執行)。主要場景有:主程式碼塊、setTimeout、setInterval等 微任務microtask:

可以理解是在當前task執行結束後立即執行的任務。主要場景有:Promise、process.nextTick等。