Ich bin sehr verwirrt über die Unterschiede zwischen nextTick und setImmediate. Ich habe die gesamte Dokumentation über sie im Internet gelesen, verstehe aber immer noch nicht, wie sie funktionieren.
Beispiele:
function log(n) { console.log(n); }
setImmediate
setImmediate(function() {
setImmediate(function() {
log(1);
setImmediate(function() { log(2); });
setImmediate(function() { log(3); });
});
setImmediate(function() {
log(4);
setImmediate(function() { log(5); });
setImmediate(function() { log(6); });
});
});
//1 2 3 4 5 6
nextTick
process.nextTick(function() {
process.nextTick(function() {
log(1);
process.nextTick(function() { log(2); });
process.nextTick(function() { log(3); });
});
process.nextTick(function() {
log(4);
process.nextTick(function() { log(5); });
process.nextTick(function() { log(6); });
});
});
//1 4 2 3 5 6
Warum diese Ergebnisse? Bitte erklären Sie mit einer visuellen oder sehr leicht verständlichen Erklärung. Selbst die Entwickler des Knotenkerns sind sich nicht einig, wie nextTick und setImmediate von Menschen verstanden werden sollen.
Quellen:
1 4 2 3 5 6
für beide Ausführungen gleich ( ) (Node v5.6.0)Antworten:
Betrachten Sie die folgenden zwei Beispiele:
setImmediate
nextTick
setImmediate-Rückrufe werden einmal pro Iteration in der Reihenfolge, in der sie in die Warteschlange gestellt wurden, aus der Ereignisschleife ausgelöst. Bei der ersten Iteration der Ereignisschleife wird also Rückruf A ausgelöst. Bei der zweiten Iteration der Ereignisschleife wird dann Rückruf B ausgelöst, dann wird bei der dritten Iteration der Ereignisschleife Rückruf C ausgelöst usw. Dies verhindert, dass die Ereignisschleife blockiert wird, und ermöglicht, dass andere E / A- oder Timer-Rückrufe ausgeführt werden wird in der mittleren Zeit aufgerufen (wie im Fall des 0-ms-Timeouts, das bei der Iteration der 1. oder 2. Schleife ausgelöst wird).
nextTick-Rückrufe werden jedoch immer sofort ausgelöst, nachdem der aktuelle Code ausgeführt wurde und bevor Sie zur Ereignisschleife zurückkehren. Im nextTick-Beispiel führen wir am Ende alle nextTick-Rückrufe aus, bevor wir jemals zur Ereignisschleife zurückkehren. Da der Rückruf von setTimeout von der Ereignisschleife aufgerufen wird, wird der Text 'TIMEOUT FIRED' erst ausgegeben, wenn wir mit jedem nextTick-Rückruf fertig sind.
quelle
TIMEOUT FIRED 1 4 2 3 5 6
Laut Node.js werden die Dokumentnamen dieser beiden Funktionen genau vertauscht
setImmediate () ( BEST EMPFOHLEN )
Es ist Feuer zuerst in der Ereigniswarteschlange
process.nextTick () ( VERWENDUNG FÜR SPEZIELLE FÄLLE siehe Beispiel später )
Es ist sofort Feuer, es ist eine Art Erklärung mehr am Ende in der aktuellen Datei
Wenn wir diesen Code haben
Eine visuelle Erklärung gemäß Ihrer Anfrage:
Fälle für die Verwendung von process.nextTick (), wenn Sie zuvor ein Ereignis ausgeben müssen, um es zu behandeln:
Schauen Sie sich dieses Video an, in dem Philip Roberts uns eine großartige Erklärung zur Laufzeit-Ereignisschleife gibt, und schauen Sie sich diesen Online-Eventloop-Debugger an Live-Test, wie die Ereignisschleife funktioniert
Quelle: https://github.com/nodejs/node/blob/master/doc/topics/the-event-loop-timers-and-nexttick.md#processnexttick-vs-setimmediate
quelle
Ich kann Ihre Ergebnisse für nicht reproduzieren
setImmediate
. Es sollte dasselbe sein wienextTick
(und es ist in meinen Tests), da sie in dieser Situation so ziemlich dasselbe tun. Die einzig vernünftige Erklärung dafür ist diesetImmediate
es irgendwie synchron ist, aber nicht.Und laut NodeJS-Dokumentation besteht der einzige wirkliche Unterschied darin, dass mehrere
nextTick
in einer Schleifeniteration ausgelöst werden können (abhängig vonmaxTickDepth
), während siesetImmediate
einmal pro Iteration ausgelöst werden.quelle
Unten erhalten Sie eine bessere Klarheit.
setImmediate
require
.nextTick
Einfaches Code-Snippet.
quelle
Ich denke, alle oben genannten Antworten sind veraltet, da ich mit der aktuellen Version von nodejs ständig unterschiedliche Antworten erhalten habe und es leicht zu überlegen ist
Nach dem Lesen von https://github.com/nodejs/node/blob/master/doc/topics/the-event-loop-timers-and-nexttick.md#processnexttick-vs-setimmediate beginnen
setImmediate
wir mit der Verwendung das,check queue
weil es dort ist, wo dassetImmediate
Rückruf befindet.Erste Iteration
A
ist zu drückencheck queue
Warteschlange prüfen: [A]
Zweite Iteration
A
wird herausgezogenqueue
um auszuführenWährend seiner Ausführung legte es
B
undE
zuqueue
und dann,A
vollständig und nächste Iteration beginnenWarteschlange prüfen: [B, E]
Dritte Iteration
herausziehen
B
und drückenC
D
Warteschlange prüfen: [E, C, D]
Vierte Iteration
herausziehen
E
und drückenF
G
Warteschlange prüfen: [C, D, F, G]
Schließlich
Führen Sie die Rückrufe in der Warteschlange nacheinander aus
In diesem
nextTick
Fall funktioniert die Warteschlange genauso, weshalb sie das gleiche Ergebnis liefertDer Unterschied ist:
Um klar zu sein, verwaltet die Ereignisschleife mehrere Warteschlangen und
check queue
ist nur eine davon. Der Knoten entscheidet anhand einiger Regeln, welche Warteschlange verwendet werden sollDabei wird
process.nextTick
jedoch die gesamte Regel umgangen und der RückrufnextTick
sofort ausgeführtquelle