你如何在node.js中共享EventEmitter?

fan*_*ncy 21 javascript node.js eventemitter

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

谢谢!

Ome*_*hem 22

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

eventBus.js:

const EventEmitter = require('events');
const emitter = new EventEmitter();

emitter.on('uncaughtException', function (err) {
    console.error(err);
});

module.exports = emitter;
Run Code Online (Sandbox Code Playgroud)

用法:

var bus = require('../path/to/eventBus');

// Register event listener
bus.on('eventName', function () {
    console.log('triggered!');
});

// Trigger the event somewhere else
bus.emit('eventName');
Run Code Online (Sandbox Code Playgroud)

  • upvoted 但如果我有一个文件 pub.js 和另一个 sub.js ,我需要 eventbus.js 并尝试从一个文件中触发并从另一个接收事件,则不起作用 (3认同)

srq*_*inn 14

您可以将参数传递给require调用:

var myModule = require('myModule')(Events)
Run Code Online (Sandbox Code Playgroud)

然后在"myModule"中

module.exports = function(Events) {
    // Set up Event listeners here
}
Run Code Online (Sandbox Code Playgroud)

话虽如此,如果你想共享一个事件发射器,创建一个发射器对象,然后在require调用中传递给你的"文件/模块/脚本".

更新:

虽然正确,但这是代码味道,因为您现在将模块紧密耦合在一起.相反,请考虑使用每个模块可能需要的集中式事件总线.

  • @fancy Node.js缓存模块,因此其中的代码实际上只会在您第一次需要该模块时运行. (2认同)

小智 12

为什么不使用全局流程对象的EventEmitter?

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

process.emit('customEvent', data);
Run Code Online (Sandbox Code Playgroud)

专业版:您可以禁用或完全删除模块(例如跟踪器),而无需删除路径中的所有跟踪代码.我正在为节点跟踪做到这一点.

骗子:我现在不用,但是如果你看到这里有一个问题,请告诉我;-)

  • Con:事件将锁定到一个进程,该进程阻止通过集群模块或其他方法进行水平扩展. (7认同)