在setTimeout中closuresnode.js http服务器的区别

以下的node.js程序不会退出:

var http = require('http'); var server = http.createServer(function (req,res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337,'127.0.0.1'); server.close(); 

但是这个呢:

 var http = require('http'); var server = http.createServer(function (req,res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337,'127.0.0.1'); function closeServer() { server.close(); }; setTimeout(closeServer,1); 

没有连接到服务器。 有人可以解释程序之间行为改变的原因吗? 我刚刚在Windows 7上使用node.js版本0.12.5尝试了这一点。

根据server.listen的Node.JS HTTP文档:

这个function是asynchronous的。 ..

所以如果您在调用server.close()时看到下面的代码,因为server.listenasynchronous执行,您正在closures一个尚未启动的服务器。

 var http = require('http'); var server = http.createServer(function(req, res) { res.writeHead(200, {'content-type': 'text/plain'}); res.end('Hello world\n'); }); server.listen(1337, '127.0.0.1', function() { console.log('server up and running'); }); server.close(); server.on('close', function() { console.log('closed server'); }); 

这是certificate,closures服务器之后,服务器就准备好了:

 closed server server up and running 

但是如果你在server.listen (这意味着服务器已经准备就绪)的callback中调用server.close方法,你将能够closures服务器。

 var http = require('http'); var server = http.createServer(function(req, res) { res.writeHead(200, {'content-type': 'text/plain'}); res.end('Hello world\n'); }); server.listen(1337, '127.0.0.1', function() { console.log('server up and running'); server.close(); }); server.on('close', function() { console.log('closed server'); }); 

输出:

 server up and running closed server