2017-04-07 7 views
1

Nach Lesen des Dokuments über die Node JS-Ereignisschleife unter https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/. Ich habe versucht, diesen Code zu laufen, mehr zu verstehen:Knoten JS process.nextTick und setTimeout

//setTimeout 1 
setTimeout(function A(){ 
    console.log('timeout 1 called!!!'); 
    process.nextTick(function E(){ 
     console.log('tick called'); 
    }) 
}); 
//setTimeout 2 
setTimeout(function B(){ 
    console.log('timeout 2 called!!!'); 
}); 

Und die Ergebnisse unvorhersehbar ist, wenn ich versucht habe, diesen Code mehrere Male ausführen, irgendwann ist das Ergebnis:

timeout 1 called!!! 
timeout 2 called!!! 
tick called 

Aber irgendwann könnte es sein:

timeout 1 called!!! 
tick called 
timeout 2 called!!! 

Durch mein Verständnis, dies geschieht, weil der process.nextTick Laufes nach jeder Phase der Ereignisschleife abgeschlossen.

Also, wenn Call-Stack abgeschlossen hat, hat es zwei Fälle geschehen sein:

  1. NodeJS API vollständig lösen SetTimeout 1, Zusatzfunktion A Timer-Warteschlange in Timer Phase der Ereignisschleife und Ereignisschleife Start vor NodeJS API complete resolve setTimeout 2. Das heißt, dass die Funktion E zu nextTickQueue hinzugefügt wird, bevor Funktion B zur Timer-Warteschlange hinzugefügt wird => nach Funktion A abgeschlossen, Timer-Warteschlange leer (Timer-Phase beendet) => nextTickQueue aufgerufen => Das Ergebnis ist:
timeout 1 called!!! 
tick called!!! 
timeout 2 called!!! 
  1. NodeJS API vollständiger Entschluß SetTimeout 1, Funktion A auf Zeitgeberwarteschlange in timer Phase der Ereignisschleife hinzugefügt und NodeJS API vollständigen Entschluß SetTimeout 2 danach, zusätzliche Funktion B an Zeitgeberwarteschlange vor Start der Ereignisschleife Die Event-Schleife führt also alle Callback-Funktionen in der Timer-Warteschlange aus, um die Timer-Phase abzuschließen, sodass die nextTickQueue nach Timeout 1 und Timeout 2 abgeschlossen wird. Und das Ergebnis ist:
timeout 1 called!!! 
timeout 2 called!!! 
tick called!!! 

habe ich recht zu verstehen? Könnt ihr mir bitte helfen, das zu klären? Danke :).

Antwort

1

Mit meinem Verständnis dieses wegen process.nextTick Lauf geschehen nach jeder Phase der Ereignisschleife abgeschlossen.

Keine process.nextTick werden vor dem Ende jeder Phase und vor dem Beginn der nächsten ausgeführt.

Dieser Ausgang ist nicht deterministisch. Sie können die Reihenfolge der Ausführung für oben nicht garantieren. Alles, was Sie tun können, ist der Grund dafür, basierend auf seiner Ausgabe.

Also, wenn Call-Stack abgeschlossen hat, hat es zwei Fällen geschehen sein:

NodeJS API vollständig lösen SetTimeout 1, Zusatzfunktion A Timer Warteschlange in Timer Phase der Ereignisschleife und Ereignis Loop-Start vor NodeJS API vollständige Auflösung setTimeout 2.Das ist gemein Funktion E wird zu nextTickQueue hinzugefügt werden, bevor Funktion B Timer Warteschlange => nach Funktion Eine vollständige, Timer-Warteschlange leer (Timer Phase abgeschlossen) hinzugefügt => nextTickQueue genannt => Das Ergebnis ist:

Starten Sie, sobald Sie Ihre node.js Prozess Ereignisschleife beginnt. Eine treffendere Begriff hätte event loop moves to the nextPhase before setTimeout2 resolves gewesen

Rest All Grund von Ihnen präsentiert voneinander entfernt sind gut für einige technische Terminologie verwendet. Aber das ist in Ordnung !