我想从一个文件/模块/脚本中发出事件,并在另一个文件/模块/脚本中侦听它们。如何在不污染全局命名空间的情况下在它们之间共享发射器变量?
谢谢!
答案 0 :(得分:19)
@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');
答案 1 :(得分:15)
您可以将参数传递给require调用:
var myModule = require('myModule')(Events)
然后在“myModule”中
module.exports = function(Events) {
// Set up Event listeners here
}
话虽如此,如果你想共享一个事件发射器,创建一个发射器对象,然后在require调用中传递给你的“文件/模块/脚本”。
虽然正确,但这是代码味道,因为您现在将模块紧密耦合在一起。相反,请考虑使用每个模块都需要的集中式事件总线。
答案 2 :(得分:12)
为什么不使用全局流程对象的EventEmitter?
process.on('customEvent', function(data) {
...
});
process.emit('customEvent', data);
Pro:您可以禁用或完全删除模块(例如跟踪器),而无需删除路径中的所有跟踪代码。我正在为node-trackable做到这一点。
骗局:我现在不行,但如果你在这里看到一个问题,请告诉我; - )