Der Rückgabewert von Ereignishandlern wird vollständig ignoriert. Von the documentation:
Wenn das EventEmitter
Objekt ein Ereignis sendet, werden alle in diesem speziellen Fall angebracht Funktionen werden synchron aufgerufen. Alle von den aufgerufenen Listenern zurückgegebenen Werte werden ignoriert und verworfen.
Aber was kann man tun, anstatt emittieren, um ein Objekt und haben die Callback den Zustand des Objekts ändern:
const EventEmitter = require("events").EventEmitter;
const emitter = new EventEmitter();
emitter.on("sayHello", function(e) {
e.message += " World"; // Modifying the state
});
const e = {message: "Hello"};
emitter.emit("sayHello", e);
console.log(e.message); // "Hello World"
(auch die Änderungen beachten Sie eine Instanz von EventEmitter
schaffen; ursprünglichen Code versucht verwenden on
auf EventEmitter
selbst, aber es hat nicht ein.)
Sie in den Kommentaren gesagt haben, dass yo Sie möchten vermeiden, dass Sie das Objekt als eigenen Schritt erstellen müssen. Sie können EventEmitter
leicht Subklassen Ihre eigene emitObject
(oder was auch immer) Funktion hinzuzufügen:
class MyEventEmitter extends EventEmitter {
emitObject(event, obj = {}) {
this.emit(event, obj);
return obj;
}
}
Verbrauch:
const emitter = new MyEventEmitter();
emitter.on("sayHello", function(e) {
e.message += " World";
});
const evt = emitter.emitObject("sayHello", {message: "Hello"});
console.log(evt.message); // "Hello World"
ich dort ein Objekt für das zweite Argument geliefert haben (so konnten wir die "Hello" + " World"
tun sache), aber wenn Sie es auslassen, würde ein leeres Objekt für es Standard sein (ES2015 Standardargumente).
Komplettes Beispiel:
const EventEmitter = require("events").EventEmitter;
class MyEventEmitter extends EventEmitter {
emitObject(event, obj = {}) {
this.emit(event, obj);
return obj;
}
}
const emitter = new MyEventEmitter();
emitter.on("sayHello", function(e) {
e.message += " World";
});
const evt = emitter.emitObject("sayHello", {message: "Hello"});
console.log(evt.message); // "Hello World"
@PavelGatnar Dank. aber ich muss den modifizierten Wert zurückgeben. –