2014-02-14 48 views
0

我正在學習Node.js,並嘗試setTimeout()的一個簡單示例。應該發生的事情是:Nodejs - 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

響應在執行response.end()時發送。這就是兩個語句同時打印的原因。 – Leo

+0

所以我可以改變什麼,以便'狗正在跑步'被打印,服務器等待5秒鐘,然後打印'狗已完成' – ueg1990

回答

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

你的代碼是完全正常的,它沒有任何問題。 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進行測試,而不是普通的瀏覽器。