2016-11-29 88 views
2

我有一个事件发射器(一个变换流),事件发射器基本上有一堆子发射器。将事件从一个事件发射器转发到另一个事件

我想从所有子发射事件转发到父发射器,这样的事情:

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); 
}); 

基本上,从我可以告诉,我已经转发的错误,测试和苏曼测试文件完整的事件给父母,但这看起来很丑陋。

难道至少有更复杂的方法吗?我认为没有办法直接用Node.js的'events'包来继承事件,所以我没有问这个。

回答

1

您可以覆盖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); 

或者,放入一个可重用的函数形式,所以你可以在超过使用它一个发射器不复制的代码:

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); 

这一功能将在一个新的对象,从派生被包封10如果你想更容易地重用它,但是这只有在你控制第一个EventEmitter对象的创建时才会起作用,所以你可以将它设置为支持所有消息转发的特殊派生对象。上面的示例可以“添加”到任何现有的常规对象上。


还有一个EventEmitter2对象described here,使您可以使用通配符来注册事件处理程序,所以你可以不单独命名每一个注册的所有事件的兴趣或那样的事件的一个子集。


而且,还有一个谷歌邮件列表上这个概念的讨论:https://groups.google.com/forum/#!topic/nodejs-dev/TzRPxsHf0FA

+0

谢谢,第一个解决方案不会为我工作轻松,因为我有多个sumanEvents发射器,不只是一个,和在声明exportEvents的时候,我没有处理所有这些不同的sumanEvents发射器,如果这样做合理,但您的第二种解决方案可能适用于我,谢谢:) –

相关问题