2016-11-29 85 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發射器,如果這樣做合理,但您的第二種解決方案可能適用於我,謝謝:) –

相關問題