2013-04-25 6 views
7

Ich habe Probleme zu verstehen, genau wie process.nextTick macht seine Sache. Ich dachte, ich verstanden, aber ich kann nicht zu replizieren scheinen, wie ich finde, dass das funktionieren sollte:Verständnis der Ereigniswarteschlange node.js und 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); 

Während foo geloopt, werde ich über mehrere Anfragen senden, unter der Annahme, dass handler wird mehrmals hinter foo Warteschlange gestellt werden mit callback wird nur eingereiht, wenn foo beendet ist.

Wenn ich richtig darüber, wie das funktioniert, gehe ich davon aus das Ergebnis wie folgt aussehen:

received 
received 
received 
received 
bar 
bar 
bar 
bar 

Aber es ist es nicht, nur sequentiell:

received 
bar 
received 
bar 
received 
bar 
received 
bar 

Ich sehe, dass foo wird vor der Ausführung von callback, die erwartet wird zurückgegeben, aber es scheint, dass callback ist NEXT in der Zeile, anstatt am Ende der Warteschlange, hinter allen eingehenden Anfragen. So funktioniert es? Vielleicht verstehe ich einfach nicht, wie genau die Ereigniswarteschlange im Knoten funktioniert. Und bitte zeigen Sie mich nicht here. Vielen Dank.

Antwort

2

process.nextTick setzt den Callback auf den nächsten Tick, der ausgeführt wird, nicht am Ende der Tick Queue.

Node.js doc (http://nodejs.org/api/process.html#process_process_nexttick_callback) sagen: "Es wird normalerweise ausgeführt, bevor andere E/A-Ereignisse ausgelöst werden, aber es gibt einige Ausnahmen."

setTimeout (Callback, 0) wird wahrscheinlich mehr wie Sie beschreiben.

+2

Nein, 'setTimeout' verhielt sich genauso. Ich denke, ich frage wirklich, wie ich HTTP-Anfragen verarbeiten soll, bevor eine vorherige Anfrage beendet ist. – alf

+0

Tatsächlich habe ich festgestellt, dass 'setTimeout' genau das tut, wonach ich gesucht habe, also entschuldige ich mich. Aber was genau ist 'process.nextTick' für, wenn es nicht die Verschachtelung von CPU-intensiven Aufgaben und HTTP-Verarbeitung erlaubt? – alf

+0

"nicht am Ende des Ticks" - Gibt es also eine Möglichkeit, eine beliebige Funktion am Ende der Ereigniswarteschlange zu drücken? Ist 'setTimeout (fn, 0)' ein empfohlener Weg oder nur ein Workaround? – incarnate

1

Sie sollten auf jeden Fall den Link fgascon zur Verfügung gestellt, lesen und vielleicht

https://github.com/joyent/node/issues/3335 für mehr Hintergrund. Verwenden Sie process.nextTick, wenn Sie vor einem IO einen Code aufrufen möchten, aber nachdem der aufrufende Kontext zurückgegeben wurde (normalerweise, weil Sie Listener auf einem Event-Emitter registrieren möchten und den erstellten Emitter zurückgeben müssen, bevor Sie sich registrieren können) etwas).