将事件从一个事件发射器转发到另一个

我有一个事件发射器(一个变换stream),事件发射器基本上有一堆子发射器。

我想从所有的孩子发射器转发事件到父发射器,如下所示:

const EE = require('events'); const exportEvents = new EE(); const sumanEvents = Transform(); // create new transform stream (an event emitter) sumanEvents.on('test', function () { exportEvents.emit.bind(exportEvents, 'test').apply(exportEvents, arguments); }); sumanEvents.on('error', function () { exportEvents.emit.bind(exportEvents, 'error').apply(exportEvents, arguments); }); sumanEvents.on('suman-test-file-complete', function () { exportEvents.emit.bind(exportEvents, 'suman-test-file-complete').apply(exportEvents, arguments); }); 

基本上,从我所知道的情况来看,我已经将错误,testing和suman-test-file-complete事件转发给了父类,但是这看起来相当丑陋。

至less有更复杂的做法吗? 我认为没有办法直接inheritanceNode.js的“事件”包的事件,所以我不问。

你可以覆盖sumanEvents.emit()这样你就可以看到任何被发射的事件,然后抓住它并将其回显到exportEvents

 (function(origEmitter, forwardEmitter) { // save original .emit method let oldEmit = origEmitter.emit; // assign override origEmitter.emit = function() { // allow the event to be normally emitted oldEmit.apply(origEmitter, arguments); // then forward it to the forwardEmitter forwardEmitter.emit.apply(forwardEmitter, arguments); }; })(sumanEvents, exportEvents); 

或者,放入一个可重用的函数forms,以便您可以在多个发射器上使用它,而无需复制代码:

 function forwardEmitter(origEmitter, forwardEmitter) { // save original .emit method let oldEmit = origEmitter.emit; // assign override origEmitter.emit = function() { // allow the event to be normally emitted oldEmit.apply(origEmitter, arguments); // then forward it to the forwardEmitter forwardEmitter.emit.apply(forwardEmitter, arguments); }; } forwardEmitter(sumanEvents, exportEvents); 

如果你想更容易地重用它,这个function可以被封装在一个派生自EventEmitter的新对象中,但是只有当你控制第一个EventEmitter对象的创build时才能工作,所以你可以使它成为你特殊的派生对象支持所有消息的转发。 上面的例子可以“添加到”任何现有的常规EventEmitter对象。


这里还描述了一个EventEmitter2对象,它允许您使用通配符来注册事件处理程序,以便您可以注册对所有事件或事件子集的兴趣,而无需单独对每个事件进行命名。


而且,在Google邮件列表中有关于此概念的讨论: https : //groups.google.com/forum/#!topic/ nodejs-dev/ TzRPxsHf0FA