あるファイル/モジュール/スクリプトからイベントを発行し、別のファイル/モジュール/スクリプトでそれらをリッスンしたいと考えています。グローバル名前空間を汚染することなく、それらの間でエミッター変数を共有するにはどうすればよいですか?
ありがとう!
あるファイル/モジュール/スクリプトからイベントを発行し、別のファイル/モジュール/スクリプトでそれらをリッスンしたいと考えています。グローバル名前空間を汚染することなく、それらの間でエミッター変数を共有するにはどうすればよいですか?
ありがとう!
@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');
次のように、require 呼び出しに引数を渡すことができます。
var myModule = require('myModule')(Events)
そして、「myModule」で
module.exports = function(Events) {
// Set up Event listeners here
}
そうは言っても、イベントエミッターを共有したい場合は、エミッターオブジェクトを作成してから、require 呼び出しで「ファイル/モジュール/スクリプト」に渡します。
正しいですが、モジュールを密結合しているため、これはコードの匂いです。代わりに、各モジュールに必要な集中型イベント バスの使用を検討してください。
グローバル プロセス オブジェクトの EventEmitter を使用しないのはなぜですか?
process.on('customEvent', function(data) {
...
});
process.emit('customEvent', data);
長所: ルート内のすべての追跡コードを削除することなく、モジュール (トラッカーなど) を無効にするか完全に削除できます。node-trackableに対してまさにそれを行っています。
短所: 今はわかりませんが、ここで問題が発生した場合はお知らせください ;-)