我想要这样的事情:
var eventSource = new EventEmiiter();
var eventListener = new EventEmitter();
eventSource.emit("MyEvent", data);
eventListener.on("MyEvent", function(data) {
console.log("captured an event");
});
我已经阅读了一些介绍EventEmitter的文章,所有这些文章都只使用一个同时执行emit
和on
的EventEmitter实例。我想知道这是不是最好的方式?我可以像上面那样实现事件系统吗?怎么样?
答案 0 :(得分:0)
考虑一下:如果你知道有一位歌手在你镇上的音乐厅里做歌剧,你可以去那里听歌手听。听到你的(断开的)耳机,你无法在家里听到它。有一些特定的物体可以为你传递信息,它们可以观察目标发射器并发射(中继,代理)它们自己的事件,就像无线电传输系统一样:收听收音机,你就可以听到歌手了。
你可以非常完美地将隐喻转移到EventEmitter世界。
主要问题是,为什么你需要这种架构,而不是直接听取发射器。
答案 1 :(得分:0)
我看到这个问题,因为OP想要解耦发射器和侦听器模块。所以,我想分享我通常遵循的实践。
<强> eventmanager进行强>
var PingPongListener = require('./listener');
var PingPongEmitter = require('./emiiter');
var pingPongEventListener = [];
var Manager = function(){
this.emitter = new PingPongEmitter();
this.emitter.on('pingpong', function(msg){
pingPongEventListener.forEach(function(listener, index){
listener.onPingPong(msg);
});
})
};
Manager.prototype.register = function(listener, event){
if(event=='pingpong'){
pingPongEventListener.push(listener);
}else{
console.log('Cant register listener. No such event', event);
}
};
(function(){
var tom = new Manager();
var danny = new PingPongListener('Danny');
var shawn = new PingPongListener('shawn');
tom.register(danny, 'pingpong');
tom.register(shawn, 'pingpong');
})();
<强> Emiiter.js 强>
var util = require('util');
var EventEmitter = require("events").EventEmitter;
var PingPong = function(){
var self = this;
setInterval(function(){
self.emit("pingpong", 'hello');
}, 2000);
};
util.inherits(PingPong, EventEmitter);
module.exports = PingPong;
<强> Listener.js 强>
var PingPongListener = function(name){
this.name = name;
};
PingPongListener.prototype.onPingPong = function(msg){
console.log(msg + ' ' + this.name);
};
module.exports = PingPongListener;
基本思想是在Emitter和Listener之间添加一个接口(EventManager),这允许我控制监听器之间的通信。 EventManager通常具有EventPolicies,必须由Listener满足才能订阅该事件。
注意强>
欢迎任何有关这一想法的改进。