2013-04-25 19 views
7

Ho problemi a capire esattamente come process.nextTick fa la sua cosa. Credevo di aver capito, ma io non riesco a replicare come mi sento questo dovrebbe funzionare:comprensione della coda eventi node.js e process.nextTick

var handler = function(req, res) { 
    res.writeHead(200, {'Content-type' : 'text/html'}); 
    foo(function() { 
     console.log("bar"); 
    }); 
    console.log("received"); 
    res.end("Hello, world!"); 
} 

function foo(callback) { 
    var i = 0; 
    while(i<1000000000) i++; 
    process.nextTick(callback); 
} 

require('http').createServer(handler).listen(3000); 

Mentre foo è looping, io inviare più diverse richieste, partendo dal presupposto che handler verranno accodate più volte dietro foo con callback in coda solo quando foo è terminato.

se sono corrette su come funziona, presumo il risultato sarà simile a questa:

received 
received 
received 
received 
bar 
bar 
bar 
bar 

ma non è così, è solo sequenziale:

received 
bar 
received 
bar 
received 
bar 
received 
bar 

vedo che foo restituisce prima di eseguire callback che è previsto, ma sembra che il numero callback sia NEXT in linea, piuttosto che alla fine della coda, dietro tutte le richieste in arrivo. È così che funziona? Forse sto solo non capendo come funziona esattamente la coda degli eventi nel nodo. E per favore non puntarmi here. Grazie.

risposta

2

process.nextTick inserisce la richiamata sul tick successivo che verrà eseguito, non alla fine della coda di tick.

Node.js doc (http://nodejs.org/api/process.html#process_process_nexttick_callback) dire: "In genere viene eseguito prima di ogni altro evento di I/O, ma ci sono alcune eccezioni."

setTimeout (callback, 0) probabilmente funzionerà più come descritto.

+2

No, 'setTimeout' si comportava allo stesso modo. Suppongo che mi stia davvero chiedendo come dovrei iniziare ad elaborare le richieste HTTP prima che una richiesta precedente sia finita. – alf

+0

In realtà, ho capito che 'setTimeout' fa esattamente quello che stavo cercando, quindi mi scuso. Ma che cosa è esattamente 'process.nextTick' se non consente l'interleaving delle attività intensive della cpu e l'elaborazione http? – alf

+0

"non alla fine del tick" - quindi, c'è un modo per spingere una funzione arbitraria alla fine della coda degli eventi? 'SetTimeout (fn, 0)' è un metodo consigliato o solo una soluzione? – incarnate

1

si dovrebbe certamente leggere il fgascon link fornito, e forse

https://github.com/joyent/node/issues/3335 per sfondo più.

Utilizzare process.nextTick per quando si desidera chiamare del codice prima di qualsiasi IO, ma dopo che è stato restituito il contesto di chiamata (solitamente perché si desidera registrare gli ascoltatori su un emettitore di eventi e necessario restituire l'emettitore creato prima di poter registrare nulla).