Seit Node.js v6.0.0 wird der neue class
Syntax- und Argumentverbreitungsoperator vollständig unterstützt, sodass es ziemlich sicher und ziemlich einfach ist, die gewünschte Funktionalität mit einfacher Vererbung und Methodenüberschreibung zu implementieren:
'use strict';
var EventEmitter = require('events');
class MyEmitter extends EventEmitter {
emit(type, ...args) {
super.emit('*', ...args);
return super.emit(type, ...args) || super.emit('', ...args);
}
}
Diese Implementierung basiert auf der Tatsache, dass die ursprüngliche emit
Methode der EventEmitter
Rückgabe true
/ false
abhängig davon ist, ob das Ereignis von einem Listener behandelt wurde oder nicht. Beachten Sie, dass die Überschreibung eine return
Anweisung enthält, sodass wir dieses Verhalten für andere Verbraucher beibehalten.
Hier besteht die Idee darin, mit dem star event ( *
) Handler zu erstellen, die für jedes einzelne Ereignis (z. B. zu Protokollierungszwecken) und für das leere Ereignis (z.''
) für einen Standard- oder catch all-Handler, der ausgeführt wird, wenn nichts anderes dies abfängt Veranstaltung.
Wir stellen sicher, dass das *
Ereignis star ( ) zuerst aufgerufen wird , da bei error
Ereignissen ohne Handler das Ergebnis tatsächlich eine Ausnahme ist, die ausgelöst wird. Weitere Informationen finden Sie in der Implementierung desEventEmitter
.
Zum Beispiel:
var emitter = new MyEmitter();
emitter.on('foo', () => console.log('foo event triggered'));
emitter.on('*', () => console.log('star event triggered'));
emitter.on('', () => console.log('catch all event triggered'));
emitter.emit('foo');
emitter.emit('bar');
Wenn bereits eine EventEmitter-Instanz vorhanden ist, Sie diese bestimmte Instanz jedoch an das neue Verhalten anpassen möchten, können Sie dies einfach tun, indem Sie die Methode zur Laufzeit wie folgt patchen:
emitter.emit = MyEmitter.prototype.emit;