我试图在close()
TCP服务器上调用nodeJS
,但似乎没有发生。这是我的代码
var net = require('net');
var server = net.createServer(function(){console.log("SERVER CREATED")});
server.listen(4000,function(){console.log("SERVER LISTENING")});
setTimeout(function () {
console.log(">>> CLOSING ");
server.close(function () {console.log("CLOSED!!")});
}, 2000);
setTimeout(function () {
console.log(">>> TEST TIMED OUT!!! ");
process.exit(1);
}, 2000);
我使用计时器来确保服务器有足够的时间来调用回调函数。它很奇怪,但我得到的唯一输出是
SERVER LISTENING
>>> CLOSING
>>> TEST TIMED OUT!!!
任何想法为什么?是关闭调用,但不知何故没有输出任何东西?
答案 0 :(得分:2)
我运行了你的代码,它确实很有意义。如果您在流程退出时增加超时,它将按预期工作。
Node是单线程的,因此一次只执行一件事。它还按照链接到它们的事件的顺序调用回调。
我重写了你的测试,以便更容易解释顺序:
var net = require('net'),
serverCreated = function(){console.log("SERVER CREATED")},
serverListening = function(){console.log("SERVER LISTENING")},
serverClosing = function () {
console.log(">>> CLOSING ");
server.close(serverClosed)
},
serverClosed = function () {console.log("CLOSED!!")},
processExit = function () {
console.log(">>> TEST TIMED OUT!!! ");
process.exit(1);
},
server = net.createServer(serverCreated);
server.listen(4000,serverListening);
setTimeout(serverClosing, 2000);
setTimeout(processExit, 2000);
所以执行的顺序是:
如果在步骤6中添加4ms,则6之后的顺序变为:
在我的机器上我必须添加4毫秒,但在其他机器上它可能或多或少。这取决于ServerClosing需要多长时间。
注意:您不必调用proces.exit。当没有更多回调或代码要执行时,节点将退出。只需从我的示例中删除最后一行来测试它。