在Node.js中,如何将模块的所有事件转发到另一个模块?

9

假设我正在创建一个模块,该模块位于“net”模块之上。我的模块具有自己的事件,但还允许客户端监听由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');});
...

有没有更加习惯的方法可以让我将一个模块的所有事件(或一部分事件)简单地转发到另一个模块的客户端?

我预计这种情况经常出现,所以我希望能以最干净的方式完成它。

2个回答

3

过去,我所做的是处理 newListener事件。在我的类中没有附加处理程序,直到有一个处理程序与它关联。然后,当它被附加时,我将其附加到基类。

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

您可以首先检查event参数,以过滤要传递的事件。

请注意,如果您必须删除监听器,则这可能不是那些情况下最好的解决方案。


看起来在v0.10版本中会有一个'removeListener'事件(https://github.com/joyent/node/pull/3806) - Christian Tellnes

0

我从未尝试过,现在也无法测试,但您可以尝试以下方法:

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

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

代理事件并调用自身;

var oldEmit = tcp.emit;

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

请告诉我它是否有效!上述仅是概念证明,我没有考虑做这件事的副作用。

这意味着监听事件 tcp 的其他模块通常发出的事件将不会调用它们的处理程序。 - Michelle Tilley
如果需要让其他处理程序使用正确的代码,我已经更新了代码。无论如何,这绝不是建议的用法,只是一个概念证明。 - Jason Brumwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接