25

我想从一个文件/模块/脚本发出事件并在另一个文件/模块/脚本中收听它们。如何在不污染全局命名空间的情况下在它们之间共享发射器变量?

谢谢!

4

3 回答 3

26

@srquinn 是正确的,您应该使用共享的单个实例:

事件总线.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 回答