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:
- 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!!!
- 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 :).