如何从事件侦听器返回值?
见下面的例子:
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"
我想修改事件值并返回修改后的版本。
我该怎么做?
答案 0 :(得分:8)
完全忽略事件处理程序的返回值。来自the documentation:
当
EventEmitter
对象发出事件时,将同步调用附加到该特定事件的所有函数。被调用者返回的任何值都将被忽略,并将被丢弃。
但你可以做的是发出一个对象并让回调修改该对象的状态:
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"
(另请注意创建EventEmitter
实例的更改;您的原始代码尝试在on
本身使用EventEmitter
,但它没有。{1}}。 )
您在评论中已经说过,您希望避免将对象创建为自己的步骤。您可以轻松地将EventEmitter
子类化为添加自己的emitObject
(或其他)函数:
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"
我已经为那里的第二个参数提供了一个对象(所以我们可以做"Hello" + " World"
的事情),但如果你把它关掉了,一个空白的对象就会被默认(ES2015默认参数)
完整示例:
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"