2016-11-29 17 views
2

私は1つのイベントエミッタ(トランスフォームストリーム)を持ち、そのイベントエミッタは基本的に子エミッタの束を持っています。私は、親のエミッタにすべての子エミッタからこのようなイベントを転送したい1つのイベントエミッタから別のイベントエミッタへのイベントの転送

:私が言うことができるものから、基本的に

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

を、私はエラー、テスト、およびスーマン・テストを転送しています-file-completeイベントを親に送信しますが、これはかなり醜いようです。

少なくとももっと洗練された方法がありますか? Node.jsのイベントパッケージを使ってイベントを直接継承する方法がないと私は考えています。

答えて

1

あなたはあなたが放出され、その後、それをつかむとexportEventsにそれをエコーし​​た任意のイベント見ることができましたsumanEvents.emit()をオーバーライドすることができます:

(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オブジェクトの作成を制御する場合にのみ機能し、すべてのメッセージの転送をサポートする特殊な派生オブジェクトにすることができます。上記の例は、既存の通常のEventEmitterオブジェクトに「追加」することができます。


あなたが個別に各1を命名することなく、すべてのイベントまたはそのようなイベントのサブセットへの関心を登録することができるようにイベントハンドラを登録するには、ワイルドカードを使用することができますEventEmitter2オブジェクトdescribed hereもあります。


そして、Googleのメーリングリストでこの概念の議論があります:私は、複数のsumanEventsエミッターだけではなく、1を持っているのでhttps://groups.google.com/forum/#!topic/nodejs-dev/TzRPxsHf0FA

+0

おかげで、最初のソリューションは、私のために簡単に動作しませんし、 exportEventsが宣言された時点で、それらの異なるsumanEventsエミッタのすべてを処理する必要はありませんが、それは意味がありますが、2番目の解決策は私のために働くかもしれません:) –

関連する問題