提问者:小点点

如何抽象不同模块的事件


我使用两个不同的模块。(比如模块1和模块2.)这两个模块在接收数据时都会激发data事件。

var mod1 = require('./module1');
var mod2 = require('./module2');

mod1.on(`data`, listener());
mod2.on(`data`, listener());

我希望能够调用公共侦听器,而不需要知道不同的模块。例如,您是否可以使用诸如接口或抽象类之类的东西来执行以下操作?

for (let step = 0; step < 10; step++) {
  var mod = new ModFactory();
  mod.on(`data`, commonListener())
}

共1个答案

匿名用户

这里有一个方法可以做到。

>

  • 创建第三个可以调用的模块,类似于event-source。让它导出一个EventEmitter对象(单例)。

    让mod1和mod2都使用event-source模块,并将事件发送到event-source创建eventEmitter。

    然后让希望接收这些消息的其他代码也加载event-source模块,并将侦听器放在其单例EventEmitter上。

    这样,侦听代码就不需要知道事件来自何处的任何信息,它可以在一个eventEmitter对象上侦听所有事件。

    这样,mod1mod2总是将消息发送到同一eventEmitter,任何外部代码都可以检索并侦听该eventEmitter。更灵活一点的做法是重新构造mod1mod2,以便将您希望它们发出的EventEmitter传递给它们(在某种模块构造函数中)。然后,外部模块可以创建自己的eventEmitter,并在mod1mod2加载时将其传递给它们。这将mod1mod2两个模块保留为仍然独立的模块,并让调用方决定它们向哪个EventEmitter对象发射。