我希望一个或多个文件发出事件,多个其他文件监听事件。它们应该共享同一个实例。这就是我试图做的
要测试代码,我有3个文件
eventEmitter.js
-这将创建一个新的EventEmitter
对象并将其导出eventGenerator.js
-使用emitEvent.js
发出事件listenEvent.js
-使用emitEvent.js
侦听事件
我在eventGenerator.js
和listenEvent.js
中使用require
,并在eventEmitter.js
中导出对象,我希望它遵循单例模式,并且它们共享相同的实例。
这里有一些资源我在发布之前已经签出了。免责声明:我已经从这些文件中修改了一些设计/代码进行测试。
另一个源文件中的node.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 eventn");
}, 3000);
listenEvent.js
//listenEvent.js
var eventEmitter = require('./eventEmitter.js');
var universalEmitter = eventEmitter.universalEmitter;
universalEmitter.on('Hello',function(){
console.log('received hellon');
});
问题
listenEvent.js
未接收到事件并立即退出- 如果我在同一个文件上发射和监听,它工作得很好
- 看起来
listenEvent.js
和eventGenerator.js
具有不同的em
对象实例。为什么会发生这种情况
我是不是遗漏了一些琐碎的东西?
提前感谢!
在回答我自己的问题时,我用了一种不同的方法——使用全局变量我仍然无法用另一种方法解决这个问题。这是的3个文件
eventEmitter.js
var events = require('events');
global.universalEmitter = new events();
eventGenerator.js
setInterval(function () {
universalEmitter.emit('Hello');
console.log('emitting eventn');
}, 2000);
listenEvent.js
require('./emitEvent');
require('./listenEvent');
universalEmitter.on('Hello',function(){
console.log('received hellon');
});
我也遇到过同样的问题。这似乎是解析JavaScript文件时发生的意外。TBH我不知道它在技术上有多正确。
因此,当您运行代码时,EventEmitter函数以及自定义发射器和侦听器需要由Node引擎进行解析。若在应该发出的时候并没有对其进行解析,则节点永远不会知道存在任何此类代码。
在我的例子中,发射器处于正常的代码流中。但是侦听器位于一个单独的文件中,该文件从未导入(或者您可以说已使用)。所以Node从未解析过它,即使事件被触发,它也没有被监听。
为了解决这个问题,我使用了订阅方法,以确保侦听器在第一次发出之前得到解析。
//eventGenerator.js
import listenEvent from '..listenEvent';
.....//SomeCode
listenEvent.register(eventEmitter)
.....//SomeCode
setInterval(function () {
universalEmitter.emit('Hello');
console.log("emitting eventn");
}, 3000);
因此,在发出事件之前,如果侦听器中的方法被调用,则会对其进行解析,并为节点引擎所知。
//listenEvent.js
export let register = (eventEmitter) => {
//Your listener Code
}
这个例子并没有显示理想的方法来做到这一点。然而,应该给你可以做什么来实现它的想法。