Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在node.js中共享EventEmitter?_Javascript_Node.js_Eventemitter - Fatal编程技术网

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

Javascript 如何在node.js中共享EventEmitter?,javascript,node.js,eventemitter,Javascript,Node.js,Eventemitter,我想从一个文件/模块/脚本发出事件,并在另一个文件/模块/脚本中侦听它们。如何在它们之间共享发射器变量而不污染全局命名空间 谢谢 您可以传递参数以要求调用: var myModule = require('myModule')(Events) 然后在“myModule”中 话虽如此,如果您想要共享一个事件发射器,请创建一个发射器对象,然后在require调用中传递给您的“文件/模块/脚本” 更新: 虽然正确,但这是一种代码味道,因为您现在将模块紧密耦合在一起。相反,考虑使用每个模块都需要的集中

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


谢谢

您可以传递参数以要求调用:

var myModule = require('myModule')(Events)
然后在“myModule”中

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

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

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

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

process.emit('customEvent', data);
Pro:您可以禁用或完全删除模块(例如跟踪器),而无需删除路线中的所有跟踪代码。我正是为了这个


犯人:我现在不知道,但是如果你看到这里有陷阱,请告诉我;-)

@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');
用法:

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');

您如何控制这些需求的流量?假设有4个文件需要它。模块是否只公开一个变量=new EventEmitter()?在任何人对requires做任何事情之前,它都会被实例化?我刚刚实现了我描述的模式,它似乎工作得很好。我有一个名为
emitters
的模块,它公开了一个
exports.variable=neweventemitter()
。两个文件<代码>要求<代码> >代码>发射器< /代码>模块,并可以通过<代码>变量< /> >传递事件。您还可以考虑保存创建发射器对象的顶层模块,然后将该对象传递给需要侦听“全局”的子模块。如果我敢用这个词,我假设我描述的模式会在每次我需要时实例化一个新的EventEmitter,但它的行为似乎不太好。希望我没有遗漏什么。@fancy Node.js缓存模块,因此它们中的代码实际上只会在您第一次需要该模块时运行。事件名称中的最终/可能冲突,显式似乎更安全。Con:事件将锁定到一个进程,这会阻止通过群集模块或其他方法进行水平扩展。@如何在群集中的工作人员之间共享事件发射器?群集共享服务器端口,但我不确定他们是否可以轻松共享javascriptobjects@Louis在任何共享事件发射器上,这都将是一个问题,除非您对naming@Sascha_Reuter这方面的一个变体可能是将您自己的事件发射器指定为processupvoted的属性,但如果我需要一个文件pub.js和另一个sub.js,那么它就不起作用并尝试从一个启动并从另一个接收事件