NodeJS中net模块listening回调置于setImmediate()的含义解析
Node.js net模块listening回调的事件循环阶段解析
核心结论
是的,net.Server的listening回调确实运行在事件循环的check阶段,和setImmediate()回调的执行时机完全一致。
为什么JS源码里看不到setImmediate?
你查看的lib/net.js是Node.js的JS层逻辑,但listening事件的调度逻辑其实在C++底层实现:
- 调用
server.listen()后,底层libuv库会完成socket的监听绑定操作,绑定完成后,会通过uv_check_t句柄(对应事件循环的check阶段)通知JS层。 - JS层收到通知后触发
listening事件,这个调度过程和setImmediate()的底层实现逻辑一致,因此官方文档用“放入setImmediate()中”来简化描述它的执行时机,而非JS代码里真的调用了setImmediate。
验证方式
可以通过一段代码验证两者的执行时机一致性:
const net = require('net'); const server = net.createServer(); // 注册setImmediate回调 setImmediate(() => console.log('setImmediate 执行')); // 注册listening回调 server.on('listening', () => { console.log('listening 回调执行'); server.close(); }); server.listen(0); // 绑定随机空闲端口
运行这段代码会发现,两个回调会在事件循环的同一轮check阶段执行,执行顺序取决于它们被加入队列的先后。
内容的提问来源于stack exchange,提问作者DoHan_Kim
相关产品推荐
相关产品推荐

