Sie sollten niemals eine CPU-intensive Operation mit process.nextTick()
unterbrechen
Sie sollten niemals eine solche Arbeit mit process.nextTick()
unterbrechen. Wenn Sie dies tun, führt dies zu einer Mikroaufgabenwarteschlange, die nie leer wird - Ihre Anwendung wird für immer in derselben Phase feststecken! -- Thomas Hunter. Verteilte Systeme mit Node.js
Jede Phase der Ereignisschleife enthält mehrere Rückrufe:
Sobald process.nextTick()
ausgelöst wird, bleibt es immer in derselben Phase.
Beispiel
const nt_recursive = () => process.nextTick(nt_recursive);
nt_recursive(); // setInterval wird niemals ausgeführt
const si_recursive = () => setImmediate(si_recursive);
si_recursive(); // setInterval wird ausgeführt
setInterval(() => console.log('Hallo'), 10);
In diesem Beispiel repräsentiert das setInterval()
einige asynchrone Arbeiten, die die Anwendung ausführt, wie z.B. auf ankommende HTTP-Anfragen zu reagieren.
Wenn die Funktion nt_recursive()
ausgeführt wird, landet die Anwendung in einer Mikroaufgabenwarteschlange, die nie leer wird, und die asynchronen Arbeiten werden nie verarbeitet.
Aber die alternative Version si_recursive()
hat nicht den gleichen Seiteneffekt.
Das Hinzufügen von setImmediate()
-Aufrufen innerhalb einer Überprüfungsphase fügt Rückrufe zur Warteschlange der Überprüfungsphase der nächsten Ereignisschleifeniteration hinzu, nicht zur Warteschlange der aktuellen Phase.
Fall könnte process.nextTick
verwenden
Lassen Sie die Funktion alle asynchron verarbeiten.
function foo(count, callback) {
if (count <= 0) {
return process.nextTick(() => callback(new TypeError('count > 0')));
}
myAsyncOperation(count, callback);
}
-- Thomas Hunter. Verteilte Systeme mit Node.js
In diesem Fall ist es in Ordnung, entweder setImmediate()
oder process.nextTick()
zu verwenden; stellen Sie nur sicher, dass Sie versehentlich keine Rekursion einführen.