Node.js 在侦听I/O事件时,什么使事件循环保持打开状态?
js指出,框架“在没有更多回调可执行时退出事件循环” 我在任何地方都没有清楚解释的是,在启动等待输入的I/O模块后,是什么使事件循环保持运行。例如,在这个规范的“Hello World”HTTP服务器示例中,Node.js继续无限期地侦听传入的HTTP请求:Node.js 在侦听I/O事件时,什么使事件循环保持打开状态?,node.js,Node.js,js指出,框架“在没有更多回调可执行时退出事件循环” 我在任何地方都没有清楚解释的是,在启动等待输入的I/O模块后,是什么使事件循环保持运行。例如,在这个规范的“Hello World”HTTP服务器示例中,Node.js继续无限期地侦听传入的HTTP请求: require('http').createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello
require('http').createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}).listen(8080);
虽然总是有可能回调隐式
请求
事件处理程序,但在实际HTTP请求传入之前,不会处理任何事件。这是否意味着Node.js网站上的声明不完全正确?或者,这里是否有我遗漏的细微差别?细微差别是,在“引擎盖下”也有回调
在这种情况下,HTTP服务器正在等待TCP端口上的传入连接,直到该端口显式关闭(server.close()
),这将添加到挂起回调的列表中
您甚至不必定义请求处理程序来演示这一点:
require('http').createServer().listen(8080);
这显示了几秒钟后关闭端口时发生的情况:
var server = require('http').createServer().listen(8080);
setTimeout(function() {
server.close();
}, 2000);
这基本上是我所期望的,但是对于传入连接的“幕后”处理真的使用回调吗?我只是把HTTP库的源代码挖掘回TCP C++包装器,我没有看到任何看起来像真正回调的东西。除了回调之外,事件循环是否还等待打开的资源句柄关闭?@ScottSB我认为在这种情况下,“回调”是一个令人困惑的术语,因为很容易认为这意味着JS回调函数,但事实并非如此。“I/O处理程序”可能更好。我认为一个刚刚打开的资源句柄不会阻止进程退出,只有当有一个活动的处理程序在使用该资源时。