9

假设我正在创建自己的模块,它位于“网络”模块的顶部。我的模块有自己的事件,但也允许客户端监听 tcp 连接发出的网络事件:

mymod.on('myevent',...); // my event
mymod.on('connect',...); // net event
mymod.on('end',...);     // net event

现在我正在做以下事情

...
tcp.on('connect',function(){ self.emit('connect');});
tcp.on('end',function(){ self.emit('end');});
...

我有没有一种更惯用的方式来简单地将所有事件(或事件子集)从一个模块转发到另一个模块的客户端?

我希望这种情况一直出现,所以我想以最干净的方式做到这一点。

4

2 回答 2

3

我过去所做的是处理newListener事件。在将一个处理程序附加到我的班级之前,我不会费心附加处理程序。然后,当它存在时,我将它附加到基类。

this.on('newListener', function (event, listener) {
    baseClassInstance.on(event, listener);
})

您可以通过event首先检查参数来过滤传递哪些事件。

请注意是否必须删除侦听器。在这些情况下,这可能不是最佳解决方案。

于 2012-09-24T02:38:15.817 回答
0

我从未尝试过,目前无法测试,但您可以尝试以下方法;

将所有事件代理到另一个对象

tcp.emit = mymod.emit.bind(mymod);

代理事件并调用它自己的;

var oldEmit = tcp.emit;

tcp.emit = function() { 
    mymod.emit.apply(mymod, arguments); 
    return oldEmit.apply(this, arguments);
}

让我知道它是否有效!以上只是一个概念证明,我没有考虑这样做的副作用。

于 2012-09-24T00:14:58.583 回答