2012-10-10 227 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秒)。 这应该工作。