在程式設計領域,回調在非同步執行中起著至關重要的作用。雖然人們普遍認為回調是非同步操作的,但這種行為背後的底層機制對許多人來說仍然不確定。本文將深入研究在基於回呼的程式設計中啟用非同步執行的語法和實作細節。
與普遍看法相反,沒有特定的語法元素來指示函數是非同步執行還是同步執行。回調可以在任一模式下運行,例如以下情況:
異步:
同步:
JavaScript 本身不具備任何非同步執行函數的固有機制。要實現此行為,可以採用以下兩種方法之一:
C 編碼函數(如 setTimeout)依賴複雜的技術來促進非同步執行。涉及的主要機制是事件循環。
每個 Web 瀏覽器的核心都是事件循環,它是一個殘餘網路早期出現的非同步網路協定。這種機制允許瀏覽器同時處理多個 I/O 請求,而無需求助於額外的執行緒。
事件循環依賴C 中稱為select()(或類似變體)的關鍵系統呼叫:
select() 使系統能夠同時監控大量I/O 操作。當任何選定的 I/O 通道上的資料可用時,函數會傳回,向瀏覽器發出訊號以啟動適當的回呼執行。
當註冊回呼函數時,JavaScript 解釋器會儲存它並同時呼叫 select() 函數。返回後,解釋器將回呼與特定的 I/O 通道關聯起來並觸發其執行。
select() 也讓瀏覽器能夠透過逾時來控制回呼的呼叫時間。透過仔細調節傳遞給 select() 的逾時參數,可以安排回呼以預定的時間間隔執行。這構成了 setTimeout 和 setInterval 等函數的基礎。
除了事件循環之外,Web 瀏覽器還使用 Web Worker 來促進 JavaScript 程式碼在單獨執行緒中的非同步執行。然而,這些工作線程仍然必須透過 select() 與主事件循環互連,以與主執行緒通訊。
Node.js 與 Web 瀏覽器一樣,利用執行緒進行檔案/磁碟 I/O 操作。完成這些任務後,執行緒與 Node.js 事件循環進行通信,從而提示執行關聯的回呼。
非同步的概念基於回呼的程式設計中的執行不能從語法本身直接辨別。它是底層機制的結果,主要是事件循環及其與 select() 等 C 級函數的交互作用。事件循環使瀏覽器能夠同時處理多個 I/O 操作,確保回呼的非阻塞執行。理解這些原則對於掌握非同步程式設計及其跨平台應用的複雜性至關重要。
以上是JavaScript 實際上是如何讓回呼異步的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!