2016-10-24 17 views
1

Der Eindruck, den ich von Leuten bekomme, ist ... Alle JavaScript-Funktionen sind synchron, wenn sie nicht mit process.nextTick verwendet werden. Wann ist die beste Zeit, es zu benutzen?Wann ist die beste Zeit für die Verwendung von process.nextTick?

Ich möchte sicherstellen, dass ich es nicht an Orten verwende, wo ich es nicht brauche. An diesem Punkt denke ich, es direkt vor einem Datenbankanruf zu verwenden, aber zur gleichen Zeit, wie ich es verstehe, sind diese Aufrufe standardmäßig asynchron aufgrund der gesamten "async IO" -Ding.

Sind sie nur bei intensiver Arbeit innerhalb der JavaScript-Grenzen zu verwenden? Wie das Parsen von XML usw.?

Btw, es gibt bereits eine Frage like this, aber es scheint tot, also habe ich einen anderen erhoben.

+0

'Funktionen sind synchron, wenn sie nicht mit process.nextTick' nope verwendet werden, sie sind asynchron, wenn Sie Rückrufe anstelle von Rückkehr verwenden, und wenn Sie auf etwas warten müssen. 'Prozess.nextTick 'wird verwendet, um den Code in die Ereignisschleife zu schieben und zu säubern (Beispiel: rekursive Schleife der asynchronen Funktion, die zum Überlauf des Call-Stacks führen würde) – DrakaSAN

+1

@DrakaSAN Ja, aber [Callbacks verwenden] ist es nicht genau ein Zeichen von Asynchronität] (http://stackoverflow.com/q/19083357/1048572) entweder. – Bergi

Antwort

2

Diese Antwort erhebt keinen Anspruch auf Vollständigkeit, aber hier sind meine Gedanken:

ich zwei Anwendungsfälle vorstellen kann. Der erste ist, um sicherzustellen, dass etwas wirklich asynchron ist. Dies ist praktisch, wenn Sie EventEmitter verwenden. Stellen Sie sich vor Sie alle Methoden des Emitters zu verwenden, wie dies in der Lage sein wollen:

const EventEmitter = require('events'); 

class MyEmitter extends EventEmitter { 
    aMethod(){ 
    console.log('some sync stuff'); 
    this.emit('aMethodResponse'); 
    return this; 
    } 
} 
var myEmitter = new MyEmitter(); 
myEmitter.aMethod() 
    .once('aMethodResponse',() => console.log('got response')); 

Das wird einfach nicht funktionieren, da das Ereignis ausgelöst wird, bevor der Hörer hergestellt wird. process.nextTick() stellt sicher, dass dies nicht passieren wird.

aMethod(){ 
    console.log('some sync stuff'); 
    process.nextTick(() => this.emit('aMethodResponse')); 
    return this; 
} 

Edit: entfernt zweite Vorschlag, weil es einfach falsch

+0

Guter Punkt, aber ich dachte, es nach etwas laufen zu lassen, mussten Sie 'process.setImmediate' ausführen, um den Anruf nach IO-Funktion in die Warteschlange, die es weiter hinten setzen würde? Gibt es auch ein etabliertes Muster für Wrapping-Funktionen mit 'process.nextTick' oder' process.setImmediate'? –

+0

mein schlechter, entfernte den zweiten Teil. Der erste steht noch. –

3

war ich denke, bevor wie ein Datenbank-Aufruf etwas richtig zu verwenden, jedoch zugleich, wie ich sie verstehe, diejenigen, Anrufe sind standardmäßig asynchron wegen der ganzen "async IO" Sache.

Ja. Der Datenbanktreiber selbst sollte bereits nativ asynchron sein, so dass Sie nicht selbst process.nextTick verwenden müssen, um es asynchron zu machen. Der zeitaufwendigste Teil ist der IO und die Berechnungen innerhalb der Datenbank, so dass das Warten auf einen zusätzlichen Tick nur die Dinge verlangsamt.

Sind sie nur bei intensiver Arbeit innerhalb der JavaScript-Grenzen zu verwenden? Wie das Parsen von XML usw.?

Ja, genau. Sie können damit verhindern, dass große synchrone Funktionen Ihre Anwendung blockieren. Wenn Sie eine XML-Datei parsen möchten, anstatt sie 3 Sekunden lang zu durchsuchen, währenddessen keine neuen Verbindungen geöffnet werden können, keine Anfragen empfangen werden und keine Antworten gesendet werden, würden Sie die Datei streamen und jedes Mal nur kleine Teile davon analysieren bevor Sie nextTick verwenden und andere Arbeiten gleichzeitig ausführen lassen.

jedoch feststellen, dass der Parser nextTick intern und bietet eine asynchrone API verwenden soll, anstelle des Anrufers unter Verwendung von nextTick vor dem Parser aufruft.

Verwandte Themen