我想要一个或多个文件发出事件和多个其他文件来监听它。他们应该共享同一个实例。这就是我试图做的事情
要测试代码,我有3个文件
eventEmitter.js
- 这会创建一个新的EventEmitter
对象并将其导出eventGenerator.js
- 这会使用emitEvent.js
listenEvent.js
- 这会使用emitEvent.js
我在require
和eventGenerator.js
中使用listenEvent.s
并在eventEmitter.js
中导出对象,我希望它遵循单身模式并且他们共享同一个实例。
以下是一些资源我在发布之前检查了一下。 免责声明:我已经从这些文件中调整了一些设计/代码进行测试。
以下是三个文件。
eventEmitter.js
//eventEmitter.js
var events = require('events');
var em = new events.EventEmitter();
module.exports.universalEmitter = em;
eventGenerator.js
//eventGenerator.js
var eventEMitter = require('./eventEmitter.js');
var universalEmitter = eventEmitter.universalEmitter;
setInterval(function () {
universalEmitter.emit('Hello');
console.log("emitting event\n");
}, 3000);
listenEvent.js
//listenEvent.js
var eventEmitter = require('./eventEmitter.js');
var universalEmitter = eventEmitter.universalEmitter;
universalEmitter.on('Hello',function(){
console.log('received hello\n');
});
问题
listenEvent.js
未收到该活动并立即退出。listenEvent.js
和eventGenerator.js
具有em
对象的不同实例。为什么会这样? 我在这里错过了一些小事吗?
提前致谢!
答案 0 :(得分:0)
回答我自己的问题 - 我能够使用不同的方法 - 使用全局变量。 我仍然无法用其他方法找出问题。 这是3个文件
eventEmitter.js
var events = require('events');
global.universalEmitter = new events();
eventGenerator.js
setInterval(function () {
universalEmitter.emit('Hello');
console.log('emitting event\n');
}, 2000);
listenEvent.js
require('./emitEvent');
require('./listenEvent');
universalEmitter.on('Hello',function(){
console.log('received hello\n');
});
答案 1 :(得分:0)
我也遇到了同样的问题。解析JavaScript文件似乎是一个事件。 TBH我不知道它在技术上有多正确。
因此,在运行代码时,Node引擎需要解析EventEmitter函数以及自定义的发射器和侦听器。如果未在应发出的时间之前对其进行解析,则节点将永远不会知道存在任何此类代码。
就我而言,发射器处于正常代码流中。但是,侦听器位于一个单独的文件中,该文件从未导入(或可以说使用)。因此,Node从未解析它,即使事件被触发,也没有被监听。
为解决此问题,我使用了订阅方法,以确保在第一次发出侦听器之前对其进行解析。
//eventGenerator.js
import listenEvent from '..listenEvent';
.....//SomeCode
listenEvent.register(eventEmitter)
.....//SomeCode
setInterval(function () {
universalEmitter.emit('Hello');
console.log("emitting event\n");
}, 3000);
因此在发出事件之前,如果调用了侦听器中的方法,则会对其进行解析并为Node引擎所了解。
//listenEvent.js
export let register = (eventEmitter) => {
//Your listener Code
}
此示例未显示完成此操作的理想方法。但是,应该让您知道如何实现它。