非同步 JavaScript 中微任務佇列和回撥佇列的區別是什麼?


在非同步 JavaScript 中,有兩種排程任務的方式——**微任務佇列**和**回撥佇列**。JavaScript 引擎對這兩個佇列的處理方式不同。

微任務佇列

**微任務佇列**是一個任務佇列,其中的任務在當前任務之後執行。JavaScript 引擎在轉到回撥佇列中的下一個任務之前,會先處理微任務佇列。

示例

這是一個微任務佇列如何工作的示例:

<!doctype html>
<html>
<head>
   <title>Examples</title>
</head>
<body>
   <div id="result"></div>
   <script>
      console.log('start');
 
      setTimeout(function() {
         console.log('setTimeout');
      }, 0);
 
      Promise.resolve().then(function() {
         console.log('promise resolve');
      });
 
      console.log('end');
   </script>
</body>
</html>

在上面的示例中,“`setTimeout`”回撥被新增到回撥佇列。“`Promise.resolve`”被新增到微任務佇列。JavaScript 引擎會先執行微任務佇列中的所有任務,然後再轉到回撥佇列。

因此,上述程式碼的輸出(**在控制檯**)將是:

start
end
promise resolve
setTimeout

回撥佇列

**回撥佇列**是一個任務佇列,其中的任務在當前任務之後執行。**回撥佇列**由 JavaScript 引擎在執行完微任務佇列中的所有任務之後處理。

示例

這是一個回撥佇列如何工作的示例:

<!doctype html>
<html>
<head>
   <title>Examples</title>
</head>
<body>
   <div id="result"></div>
   <script>
      console.log('start');
 
      setTimeout(function() {
         console.log('setTimeout');
      }, 0);
 
      console.log('end');
   </script>
</body>
</html>

在上面的示例中,“`setTimeout`”回撥被新增到回撥佇列。JavaScript 引擎會在完成當前任務中所有程式碼的執行後執行“`setTimeout`”回撥。

因此,上述程式碼的輸出(**在控制檯**)將是:

start
end
setTimeout

微任務佇列和回撥佇列的區別

微任務佇列和回撥佇列之間的一些區別是:

  • **微任務**佇列由 JavaScript 引擎在轉到回撥佇列中的下一個任務之前處理。**回撥**佇列由 JavaScript 引擎在執行完微任務佇列中的所有任務之後處理。

  • **微任務**佇列在當前任務完成後處理。**回撥**佇列在微任務佇列為空後處理。

  • **微任務**佇列在單獨的事件迴圈中處理。**回撥**佇列在相同的事件迴圈中處理。

微任務佇列的優點

微任務佇列相對於回撥佇列的一些優點是:

  • 微任務佇列在單獨的事件迴圈中處理,這意味著如果主執行緒被阻塞,微任務佇列仍然會被處理。

  • 微任務佇列在當前任務完成後處理,這意味著任何依賴於當前任務的程式碼都可以新增到微任務佇列中,並且會在當前任務完成後立即執行。

  • 微任務佇列的優先順序高於回撥佇列,這意味著如果兩個佇列都計劃同時執行,則微任務佇列將首先執行。

回撥佇列的優點

回撥佇列相對於微任務佇列的一個優點是,回撥佇列在與主執行緒相同的事件迴圈中處理。這意味著如果主執行緒被阻塞,回撥佇列將不會被處理。

結論

在本教程中,我們瞭解了非同步 JavaScript 中微任務佇列和回撥佇列的區別。我們還了解了每個佇列的優點。

更新於:2022年7月1日

3K+ 瀏覽量

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.