事件循環是 Node.js 中管理非同步回呼的重要機制,使平台能夠執行非阻塞 I/O 操作。以下詳細分解了事件循環運作的6個關鍵點。
- 呼叫堆疊
- 回撥註冊
- 回呼隊列
- 持續監控
- 非同步操作完成
- 執行流程
1。呼叫堆疊:了解 JavaScript 中的呼叫堆疊:
- 呼叫堆疊是執行 JavaScript 程式碼的地方。當一個函數被呼叫時,它被壓入呼叫堆疊。一旦函數執行完成,就會從堆疊中彈出。
- 如果呼叫堆疊正忙於執行函數,則事件循環會等到堆疊為空後再檢查回調佇列。
2。回調註冊:如何處理非同步操作:
- Web API 和Node.js API:當發起非同步操作(如檔案讀取、網路請求或計時器)時,對應的回呼將註冊到Web API(在瀏覽器中)或Node.js API (在伺服器中)。
- 範例:
- 對於setTimeout(),當計時器到期時,回調
函數註冊到要執行的事件循環中
在巨集任務隊列中。
- 對於透過http.get()發出的網路請求,當數據
收到後,回調被放入隊列中
正在處理。
3。回調隊列:宏任務與微任務:
Node.js 維護兩種主要類型的回呼佇列
- 巨集任務佇列(任務佇列):此佇列處理來自setTimeout、setInterval、I/O操作和其他需要時間的任務等操作的回呼。此佇列中的任務僅在所有微任務處理完畢且呼叫堆疊為空後才會執行。
- 微任務佇列:此佇列包含來自 Promises 和 process.nextTick() 的回呼。微任務具有更高的優先級,並且在處理任何巨集任務之前,呼叫堆疊為空後立即執行。
4。透過事件循環進行連續監控:
- 事件循環不斷檢查呼叫堆疊和回調佇列以確定是否有任何任務需要執行。這使得 Node.js 能夠同時處理多個非同步操作,而不會阻塞主執行緒。
5。非同步操作完成:
一旦非同步操作完成,對應的回呼函數就會加入到對應的佇列:
- 如果 setTimeout() 設定的計時器到期,則關聯的回呼會註冊到巨集任務佇列中,等待目前堆疊和任何微任務處理完畢後執行。
6。執行流程:將任務移回呼叫堆疊:
- 當呼叫堆疊為空時,事件循環首先處理微任務佇列中的所有任務。這可以確保盡快處理承諾決議和其他微任務。
- 所有微任務完成後,事件循環將移至巨集任務佇列並一次執行一個任務。此任務執行將繼續,直到堆疊再次為空,此時循環再次檢查佇列。
- 任務執行後,就會從呼叫堆疊中刪除
事件循環執行範例:
console.log('Start');
setTimeout(() => {
console.log('Timeout');
}, 0);
Promise.resolve().then(() => {
console.log('Promise');
});
console.log('End');
輸出:
Start
End
Promise
Timeout
在此範例中:
- 同步日誌(「Start」和「End」)首先執行,並將它們新增至呼叫堆疊。
- setTimeout 回呼註冊在巨集任務佇列中。
- Promise 解析,將其回調加入微任務佇列。
- 清除呼叫堆疊後,事件循環會處理微任務佇列(「Promise」),然後再處理巨集任務佇列(「Timeout」)。
事件循環是 Node.js 的核心功能,可實現非同步操作的高效管理。透過持續監控呼叫堆疊和回調佇列,確保任務以非阻塞方式處理。 Web API 和 Node.js API 中回呼的註冊是維持應用程式回應能力的關鍵,使 Node.js 能夠有效地處理大量並發操作。
以上是Node.js 事件循環的標籤的詳細內容。更多資訊請關注PHP中文網其他相關文章!