Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js:如何从事件侦听器返回值?_Javascript_Node.js_Events_Event Handling_Eventemitter - Fatal编程技术网

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

Javascript Node.js:如何从事件侦听器返回值?,javascript,node.js,events,event-handling,eventemitter,Javascript,Node.js,Events,Event Handling,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(helloM

如何从事件侦听器返回值

见下例:

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"
我想修改事件值并返回修改后的版本

怎么做?

事件处理程序的返回值被完全忽略。发件人:

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


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

你好谢谢你的回答。但这太难了。因为每次我想做一个事件,我必须创建一个新的对象。还有更好的办法吗?@HasanBayat:这是微不足道的。不,没有别的办法。当然,你可以将它封装在一个函数中。Node.js是否有类似wordpress的钩子API?@HasanBayat:你可以将
EventEmitter
子类化,并添加你自己的函数来创建对象。你可以将它添加到你的答案中吗?(请)@谢谢你。但是我需要返回修改后的值。