Node.js:我如何 return 来自事件侦听器的值?

Node.js: how can I return a value from an event listener?

如何从事件侦听器中获取 return 值?

参见下面的示例:

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"

我想修改事件值和return修改后的版本。

我该怎么做?

事件处理程序的return值被完全忽略。来自 the documentation:

When the EventEmitter object emits an event, all of the functions attached to that specific event are called synchronously. Any values returned by the called listeners are ignored and will be discarded.

但是您可以做的是发出一个对象并让回调修改该对象的状态:

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 实例的更改;您的原始代码试图在 EventEmitter 本身上使用 on,但它没有一.)


您在评论中说过,您希望避免将创建对象作为其自己的步骤。您可以轻松地将 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"