我希望从一个文件/模块/脚本中发出事件,并在另一个文件/模块/脚本中监听这些事件。如何在它们之间共享emitter变量而不污染全局命名空间呢?
谢谢!
谢谢!
@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 调用将其传递给你的“文件/模块/脚本”。
虽然这是正确的做法,但这是一种代码异味,因为现在你将模块紧密地耦合在一起。相反,考虑使用可以被每个模块引用的集中式事件总线。
emitters
的模块,它公开了一个 exports.variable = new EventEmitter()
。两个文件都需要这个 emitters
模块,并可以通过 variable
传递事件。 - fancy为什么不使用全局进程对象的EventEmitter?
process.on('customEvent', function(data) {
...
});
process.emit('customEvent', data);
优点:您可以禁用或完全删除模块(例如跟踪器),而不必在路由中删除所有跟踪代码。我正在为 node-trackable 做这件事。
缺点:我现在不知道,但如果您发现问题,请告诉我;-)