如何监听Node.js中另一个对象发出的事件?

时间:2015-09-17 06:39:39

标签: javascript node.js

我想要这样的事情:

var eventSource = new EventEmiiter();

var eventListener = new EventEmitter();

eventSource.emit("MyEvent", data);

eventListener.on("MyEvent", function(data) {
    console.log("captured an event");
});

我已经阅读了一些介绍EventEmitter的文章,所有这些文章都只使用一个同时执行emiton的EventEmitter实例。我想知道这是不是最好的方式?我可以像上面那样实现事件系统吗?怎么样?

2 个答案:

答案 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满足才能订阅该事件。

注意

欢迎任何有关这一想法的改进。