我正在学习Node.js并尝试了一个简单的setTimeout()示例。应该发生的是:
“狗在跑。” (5秒钟后) “狗已经完成了。”
但是当我运行代码时,程序运行5秒钟并打印两个语句。我不确定为什么会这样。我的代码如下:
var http = require('http');
http.createServer(function(request, response) {
response.writeHead(200);
response.write("Dog is running.\n");
setTimeout(function(){
response.write("Dog is done.");
response.end();
}, 5000);
}).listen(8080);
console.log("Server started!!!")
答案 0 :(得分:3)
您可以修复此问题,将这3个标头添加到响应中:
response.setHeader('Connection', 'Transfer-Encoding');
response.setHeader('Content-Type', 'text/html; charset=utf-8');
response.setHeader('Transfer-Encoding', 'chunked');
就像这样:
var http = require('http');
http.createServer(function(request, response) {
response.setHeader('Connection', 'Transfer-Encoding');
response.setHeader('Content-Type', 'text/html; charset=utf-8');
response.setHeader('Transfer-Encoding', 'chunked');
setTimeout(function(){
response.write("Dog is done.");
response.end();
}, 5000);
response.write("Dog is running.\n");
}).listen(8080);
console.log("Server started!!!")
答案 1 :(得分:1)
你的代码非常好,并没有任何问题。 Node.js默认添加了分块标头,因此之前的答案都是错误的。
您可以使用telnet自行尝试:
$ telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
HTTP/1.1 200 OK
Date: Sat, 15 Feb 2014 00:02:02 GMT
Connection: keep-alive
Transfer-Encoding: chunked
10
Dog is running.
c
Dog is done.
0
这里的问题是大多数浏览器会缓冲传入的数据,所以在页面完全加载之前它不会显示。
您可以尝试通过增加消息(添加千字节的空格或类似内容)来解决此问题。
但如果您只是测试setTimeout,请不要担心。只需使用telnet测试它,而不是常规浏览器。