1 回答

TA貢獻2011條經驗 獲得超2個贊
node.js 中的任何事件驅動項最終都有一些代碼在將來的某個時間在事件隊列中插入回調。這可以是內置項目,如setTimeout()
,,,通過模塊setInterval()
聯網,通過net
模塊異步文件 I/Ofs
等......或者也可以是使用附加 API 的原生代碼附加組件,觸發事件和導致回調被插入到事件隊列中。這是未來某個時間發生的任何異步事件如何在 node.js 中工作的關鍵。每個異步操作都使用相同的機制。
事件循環實際上相當復雜,包含一堆不同類型的隊列。一個用于 I/O,一個用于定時器,一個用于 Promise。它們有不同的優先級和一定的順序。例如,Promise 比其他類型的事件具有更高的優先級。定時器實際上與其他定時器的工作方式略有不同,但您仍然可以在邏輯上將它們視為一組定時器,當它們被觸發時,它們會導致回調被調用。
除了定時器,當一個事件想要被觸發時,一些本地代碼會在某個地方插入一個回調到事件隊列的適當部分。當事件循環處理該特定類型的事件時,它將調用與該事件關聯的回調并執行與該回調關聯的 Javascript。當該回調返回時,它會繼續圍繞事件循環尋找其他事件來運行回調。如果沒有找到任何準備就緒的東西,它就會休眠,直到有東西被插入到事件隊列中或直到下一個計時器準備好觸發。
計時器使用排序鏈表,下一個計時器位于列表的前面。事件循環只是將當前系統時間與列表前面的計時器的觸發時間進行比較。如果當事件循環開始檢查計時器時該事件觸發的時間(或超過計時器),則執行與該計時器關聯的回調并將其從鏈接列表中刪除。如果不是,則事件循環繼續處理其他類型的事件。
添加回答
舉報