2016-10-26 4 views
0

Was ist der beste Weg, oder gibt es eine Best Practice oder Workaround, um ein Ereignis von einem statischen Methodenaufruf zu emittieren?ES6: Ereignisse von statischen Methoden ausstrahlen

Angenommen, ich habe eine ES6-Klasse, die upload aufruft und Dateien in einem Verzeichnis rekursiv auf einen Endpunkt hochlädt. Ich möchte, dass nach jeder einzelnen Datei ein Ereignis erfolgreich hochgeladen wird. Ich weiß, dass ich die Klasse erben kann EventEmitter, aber die .on und .emit Funktionen nicht vorhanden sind, ohne eine neue Instanz der Klasse zu instanziieren. Gibt es einen Weg dazu?

+0

Wie wäre es dann mit einem Singleton? – MaxArt

+0

Das Instanziieren einer neuen Instanz einer Klasse entspricht im Wesentlichen dem Erstellen eines statischen Objekts. Warum nicht? – tcooc

+0

@MaxArt Ich dachte darüber nach, aber die "Upload" -Methode ruft dann "uploadFile" einzeln auf, während es durch Verzeichnisse läuft, also befindet es sich innerhalb dieser Funktion innerhalb einer anderen statischen Methode. Singleton würde in einigen Fällen funktionieren, und ich könnte meinen Code ändern, um zu arbeiten, aber nicht sicher, ob es einen besseren Weg gab, ohne die Methoden nicht-statisch zu machen. @tcooc Die NodeJS-Laufzeit gibt mir einen 'Class.on ist keine Funktion' Fehler. –

Antwort

3

Es gibt keinen Weg um ihn herum. Wenn Sie .emit() anrufen möchten, dann brauchen Sie eine Instanz von EventEmitter irgendwo, dass Sie die .emit() anrufen können. Und das macht natürlich Sinn, weil Ihr anderer Code etwas haben muss, um .on() anzurufen, um Listener zu registrieren.

Wenn Sie für jedes Objekt keinen separaten Emitter benötigen, können Sie nur einen gemeinsam genutzten Emitter erstellen, den Sie entweder in einem anderen Objekt, in einem nützlichen Bereich oder im Modulbereich speichern oder den einzelnen Emitter erstellen können eine Klasse statisch. Wenn die Emitterinstanz eine statische Klasse ist (beim Start initialisiert), können die statischen Methoden alle darauf verweisen.

+0

Begonnen im Grunde genommen dies von @zerkms Kommentar oben, aber das ist im Wesentlichen was ich jetzt mache und es funktioniert. Innerhalb des Klassenmoduls habe ich eine lokale Bereichsinstanz von eventemitter, und ich erstelle statische Klassen ".on" und ".emit", die einfach die Argumente an diese lokal geteilte Instanz übergeben. –

Verwandte Themen