[英]How does `server.listen()` keep the node program running
當事件循環為空時, Node.js
程序終止。 如果我使用http
模塊並創建一個沒有任何回調的服務器添加到事件循環中,程序將終止:
const http = require('http');
const server = http.createServer();
但是,如果我添加listen
,程序將繼續運行:
const http = require('http');
const server = http.createServer();
server.listen(5155);
那么即使我沒有向事件循環添加任何內容, listen
方法如何保持進程運行? 它是否為事件循環添加了一些東西? 它是如何與它相互作用的?
這里有兩件事:
如果您查看有關server.listen(...)的Node.js文檔,請在第一行說明:
開始接受指定端口和主機名上的連接...
和:
這個函數是異步的。 服務器綁定后,將發出'listening'事件...
這本身不足以回答你的問題。 那么讓我們來看看代碼。
listen()
方法( https://github.com/nodejs/node/blob/master/lib/net.js#L1292 )最終調用self._listen2()
方法。 在最后一行:
process.nextTick(emitListeningNT, this);
( https://github.com/nodejs/node/blob/master/lib/net.js#L1276 )
這是一個回調:
function emitListeningNT(self) {
// ensure handle hasn't closed
if (self._handle)
self.emit('listening');
}
( https://github.com/nodejs/node/blob/master/lib/net.js#L1285 )。
這樣,除非node.js檢測到錯誤或其他一些停止條件,否則它將繼續運行。
這里的“答案”實際上並沒有回答這個問題。 真正的解釋是refs,Node的事件循環用於跟蹤異步操作以及它是否可以關閉進程。
這里更詳細地回答: https : //stackoverflow.com/a/51571024/8182008
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.