In den offiziellen Dokumenten, Abschnitt "setImmediate() vs. setTimeout()", heißt es: "setImmediate() soll ein Skript ausführen, sobald die aktuelle Umfragephase abgeschlossen ist", und wie ich verstehe, bedeutet dies auch die aktuelle Tick-/Ereignisschleife Kreislauf.
Später im Abschnitt "process.nextTick() vs setImmediate()" heißt es jedoch: "setImmediate() wird bei der folgenden Iteration oder dem 'Tick' der Ereignisschleife ausgelöst".
Also, welche ist die richtige Antwort, habe ich hier etwas verpasst?
Danke im Voraus.
Relevante Seite für Dokumente: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
Lösung des Problems
Einfache Antwort:
setImmediate
läuft beim nächsten Tick.
Einzelheiten:
setImmediate
und setTimeout
beide laufen in unterschiedlichen Phasen auf der Ereignisschleife.
setTimeout
Aus diesem Grund wird es nicht sofort ausgeführt, wenn es auf null Verzögerung eingestellt ist. Verwenden Sie setImmediate, die immer beim nächsten Tick der Ereignisschleife ausgeführt werden.
sondern
process.nextTick
kümmert sich im Grunde nicht um Phasen der Ereignisschleife. Der Callback, den Sie dieser Methode zuweisen, wird ausgeführt, nachdem die aktuelle Operation abgeschlossen ist und bevor die Ereignisschleife fortgesetzt wird.
Das Dokument, das Sie verlinkt haben, enthält eine sehr gute Erklärung zu den Unterschieden. Ich werde Ihre Aufmerksamkeit hier nur auf einige Punkte lenken. In setimmediate-vs-settimeout ist die Reihenfolge der Aufrufe nicht deterministisch, es sei denn, sie werden innerhalb eines E/A-Zyklus wie im folgenden Beispiel geplant.
Fügen Sie nun das process.nextTick
zum Beispiel hinzu
const fs = require('fs');
// I/O cycle
fs.readFile(__filename, () => {
setTimeout(() => {
console.log('timeout');
}, 0);
setImmediate(() => {
console.log('immediate');
});
});
process.nextTick(() => {
console.log('nextTick')
})
Ausgabe:
nextTick
immediate
timeout
Wenn Sie den obigen Code ausführen, wird zuerst ausgeführt, was in process.nextTick
Funktion ist. Der Grund dafür ist, dass es ausgeführt wird, bevor die Ereignisschleife fortgesetzt wird. Denken Sie daran, dass sowohl setTimeout
als setImmediate
auch ereignisschleifenbezogen sind, aber nicht process.nextTick.
Seien Sie sehr vorsichtig, wie Sie die verwenden process.nextTick
. Sie können in schlimme Situationen geraten, wenn Sie es nicht richtig verwenden.
Keine Kommentare:
Kommentar veröffentlichen