非同步 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 中微任務佇列和回撥佇列的區別。我們還了解了每個佇列的優點。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP