web-dev-qa-db-ja.com

node.jsでEventEmitterをどのように共有しますか?

あるファイル/モジュール/スクリプトからイベントを発行し、別のファイル/モジュール/スクリプトでそれらをリッスンしたいと思います。グローバル名前空間を汚染せずに、エミッター変数をそれらの間で共有するにはどうすればよいですか?

ありがとう!

21
fancy

したがって、引数を渡して呼び出しを要求することができます。

var myModule = require('myModule')(Events)

そして「myModule」で

module.exports = function(Events) {
    // Set up Event listeners here
}

そうは言っても、イベントエミッターを共有する場合は、エミッターオブジェクトを作成してから、require呼び出しで「ファイル/モジュール/スクリプト」に渡します。

更新:

正しいですが、モジュールを緊密に結合しているため、これはコードの臭いです。代わりに、各モジュールに必要となる可能性のある集中型イベントバスの使用を検討してください。

14
srquinn

@srquinnは正しいので、共有の単一インスタンスを使用する必要があります。

eventBus.js:

const EventEmitter = require('events');
const emitter = new EventEmitter();

emitter.on('uncaughtException', function (err) {
    console.error(err);
});

module.exports = emitter;

使用法:

var bus = require('../path/to/eventBus');

// Register event listener
bus.on('eventName', function () {
    console.log('triggered!');
});

// Trigger the event somewhere else
bus.emit('eventName');
22
Omer Leshem

グローバルプロセスオブジェクトのEventEmitterを使用してみませんか?

process.on('customEvent', function(data) {
  ...
});

process.emit('customEvent', data);

長所:ルート内のすべてのトラッキングコードを削除せずに、モジュール(トラッカーなど)を無効にするか、完全に削除できます。 node-trackable に対してまさにそれを行っています。

短所:今はしていませんが、ここで問題が発生した場合はお知らせください;-)

11
Sascha Reuter