Node.js:如何从事件监听器返回值?

Has*_*yat 7 javascript events event-handling node.js eventemitter

如何从事件监听器返回值?

见下面的例子:

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"
Run Code Online (Sandbox Code Playgroud)

我想修改事件值并返回修改后的版本.

我该怎么做?

T.J*_*der 9

事件处理程序的返回值完全被忽略.从文档:

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"
Run Code Online (Sandbox Code Playgroud)

(还要注意的变化产生的实例EventEmitter;你原来的代码试图利用onEventEmitter本身,而是它没有一个.)


您在评论中已经说过,您希望避免将对象创建为自己的步骤.您可以轻松地子类化EventEmitter以添加您自己的emitObject(或其他)函数:

class MyEventEmitter extends EventEmitter {
    emitObject(event, obj = {}) {
        this.emit(event, obj);
        return obj;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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"
Run Code Online (Sandbox Code Playgroud)

我已经为那里的第二个参数提供了一个对象(所以我们可以做到这"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"
Run Code Online (Sandbox Code Playgroud)