25

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

ありがとう!

4

3 に答える 3

26

@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');
于 2016-09-25T17:22:54.133 に答える
14

次のように、require 呼び出しに引数を渡すことができます。

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

そして、「myModule」で

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

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

アップデート:

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

于 2012-05-18T21:08:28.887 に答える
11

グローバル プロセス オブジェクトの EventEmitter を使用しないのはなぜですか?

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

process.emit('customEvent', data);

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

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

于 2013-02-07T14:01:26.240 に答える