1 回答

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