web-dev-qa-db-ja.com

Node.js:イベントリスナーから値を返すにはどうすればよいですか?

イベントリスナーから値を返すにはどうすればよいですか?

以下の例を参照してください。

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"

イベント値を変更して、変更したバージョンを返したいのですが。

どうすればいいのですか?

10
Hasan Bayat

イベントハンドラの戻り値は完全に無視されます。から ドキュメント

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"

そこで2番目の引数のオブジェクトを提供しました("Hello" + " World"thing)が、それを省略した場合、空白のオブジェクトがデフォルトになります(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"
9
T.J. Crowder