2017-03-15 1 views
2

Wie kann ich einen Wert von einem Ereignis-Listener zurückgeben?Node.js: Wie kann ich einen Wert von einem Ereignis-Listener zurückgeben?

Siehe Beispiel unten:

const EventEmitter = require("events").EventEmitter; 
emitter = new EventEmitter(); 
emitter.on("sayHello", function(message) { 
    return message + " World"; 
}); 
let helloMessage = emitter.emit("sayHello", "Hello"); 
console.log(helloMessage); // It should output: "Hello World" 

Ich möchte Ereigniswert ändern, und die modifizierte Version zurückzukehren.

Wie mache ich das?

+0

@PavelGatnar Dank. aber ich muss den modifizierten Wert zurückgeben. –

Antwort

5

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" 
+0

Hallo. Danke für die Antwort. aber es ist zu schwer. denn jedes Mal, wenn ich ein Ereignis machen will, muss ich ein neues Objekt erstellen. Gibt es einen besseren Weg? –

+0

@HasanBayat: Es ist trivial. Und nein, es gibt keinen anderen Weg. Sie können es natürlich in einer Funktion einpacken. –

+0

Gibt es eine WordPress-ähnliche Hook-API für Node.js? –

Verwandte Themen