2012-12-20 20 views
5

Sono nuovo su node.js, ho provato a utilizzare setTimeout per simulare connessioni lunghe e sperare che funzioni in modo asincrono.come utilizzare setTimeout in modo asincrono su node.js

var http = require('http'); 

http.createServer(function (request, response) { 
    console.log('New request @ ' + request.url); 
    (function (response) { 
     setTimeout(function() { 
      console.log('Time is up'); 
      response.writeHead(200, {"Content-Type": "text/plain"}); 
      response.end('Hello World\n'); 
     }, 3000); 
    })(response); 
}).listen(8124); 

console.log('Server running at http://127.0.0.1:8124/'); 

Tuttavia, il codice riportato sopra funziona come un'app sincrona a thread singolo, che può gestire solo una richiesta ogni 3 secondi.

Ho pensato che tutto in node.js dovrebbe agire in modo asincrono. Quindi, qual è il problema qui?

risposta

8

Il SetTimeout è asincrono, non è necessario quella funzione anonima nel mezzo, basta scrivere questo.

var http = require('http'); 

http.createServer(function (request, response) { 
    console.log('New request @ ' + request.url); 
    setTimeout(function() { 
    console.log('Time is up'); 
    response.writeHead(200, {"Content-Type": "text/plain"}); 
    response.end('Hello World\n'); 
    }, 3000); 
}).listen(8124); 

console.log('Server running at http://127.0.0.1:8124/'); 

Se si producono 10 richiesta concurent il tempo totale bozzetto sarà di circa 3 secondi, il che significa che è asincrona. È possibile utilizzare lo strumento ab per verificare, o se si programma il nodo, forse più facile da installare http-perf. ed eseguire nperf -c 10 -n 10 http://127.0.0.1:8124

+0

Ho provato con ab, e hai ragione, setTimeout è una funzione asincrona. Ma, è un po 'strano se apro diverse schede in Chrome allo stesso tempo, finisce uno ad uno tra un intervallo di 5 secondi. – Jack

+0

Penso che non sia sufficiente fare un rapido clic tra le schede in chrome .. :) – balazs

+2

Chrome non richiederà lo stesso URL contemporaneamente. Se aggiungi una variante all'URL, ad es. la prima scheda richiede http://127.0.0.1:8124/0, la seconda richiede http://127.0.1.18124/1, ecc., quindi dovrebbero comportarsi come ci si aspetta. Vedi http://stackoverflow.com/questions/15852011/why-settimeout-blocks-eventloop – Jason

-3

var asincrono,
__slice = [] .slice;

async = require ("async");

async.setTimeOut = function() {
        var arg, args, richiamata, ritardo, runWithTimeOut;
        callback = argomenti [0], ritardo = argomenti [1], arg = argomenti [2], args = 4 < = arguments.length? __slice.call (argomenti, 3): [];
        runWithTimeOut = function() {
                ritorno setTimeout (callback, il ritardo, Arg, args);
       };

        ritorno async.parallel ([runWithTimeOut]);
};

Problemi correlati