I am struggling to learn a little about node.js, and I've reached a blocking point (no pun intended). I realize that this question has been asked in various ways before, but I feel like I've digested those answers and am still missing something.
The code below is also on gist: https://gist.github.com/3866651
Basically, I don't believe that the setTimeout call is blocking, as the line "setTimeout called" is printed immediately. However, I'm stumped as to why it still takes a full 20 seconds to server two requests made in close succession.
Am I in fact missing something? Is there a way to get the 2nd request serviced before the first sendTimeout sends its response?
I've looked at "child processes" but that seems to be directly related to system calls and not to calling javascript functions.
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
Code looks great. setTimeout returns immediately. The function within will be called later (about 10 seconds in this case). This should work.