2012-10-10 223 views
1

我正在努力學習一些關於node.js的知識,並且我已經達到了一個阻止點(沒有雙關語意圖)。我意識到這個問題以前曾以各種方式提出過,但我覺得我已經消化了這些答案,但仍然錯過了一些東西。node.js settimeout問題

下面的代碼也在要旨:https://gist.github.com/3866651

基本上,我不相信setTimeout調用阻塞,如線「的setTimeout稱爲」立即打印。然而,我爲什麼仍然需要整整20秒才能服務兩個緊密連續的請求而困惑不已。

我是否真的錯過了什麼?有沒有辦法在第一個sendTimeout發送響應之前獲取第二個請求?

我已經看了「子進程」,但是,這似乎是直接相關的系統調用,而不是調用JavaScript函數。

var http = require("http"); 

function do_thing(response, callback){ 
    var d=new Date(); 
    console.log('calling setTimeout '+d.toLocaleTimeString()); 
    var timer = setTimeout(function(){ 
    var d=new Date(); 
    console.log('timeout callback '+d.toLocaleTimeString()); 
    respond(response); 
    }, 10000); 
    var d2=new Date(); 
    console.log('setTimeout called '+d2.toLocaleTimeString()); 
} 

function respond(response){ 
    var d=new Date(); 
    console.log('sending response '+d.toLocaleTimeString()); 
    response.writeHead(200, {"Content-Type": "text/plain"}); 
    response.write("hello at "+d.toLocaleTimeString()); 
    response.end(); 
} 

http.createServer(function(request, response) { 
    var d=new Date(); 
    console.log('got request '+d.toLocaleTimeString()); 
    do_thing(response, respond); 
}).listen(8888); 

var d=new Date(); 
console.log('running... '+d.toLocaleTimeString()); 


//Two web requests in close succession, still have to wait 20 secs for 2nd request to complete... 
//OUTPUT AS FOLLOWS: 
// 
//running... 12:12:00 
//got request 12:12:06 
//calling setTimeout 12:12:06 
//setTimeout called 12:12:06 
//timeout callback 12:12:16 
//sending response 12:12:16 
//got request 12:12:16 
//calling setTimeout 12:12:16 
//setTimeout called 12:12:16 
//timeout callback 12:12:26 
//sending response 12:12:26 
+0

您確定客戶端在第一個請求完成之前提交第二個請求嗎?這個樣子的客戶端是什麼樣的? – JohnnyHK

+0

我剛剛打開兩個瀏覽器選項卡,並快速連續擊中兩個選項卡中的網址。嗯......我正在看Firebug,並且在請求發出時無法從客戶端真實地告知。 – sqpierce

+0

有趣。如果我使用兩個使用curl進行請求的終端選項卡,它們會並行處理!謝謝你的提示JohnnyHK! :)我的代碼很好,我的測試很糟糕。 :( – sqpierce

回答

0

代碼看起來不錯。 setTimeout立即返回。 內部的函數將稍後調用(在這種情況下約爲10秒)。 這應該工作。