9

'net'モジュールの上にある独自のモジュールを作成しているとします。私のモジュールには独自のイベントがありますが、クライアントはtcp接続によって発行されたネットワークイベントをリッスンすることもできます。

mymod.on('myevent',...); // my event
mymod.on('connect',...); // net event
mymod.on('end',...);     // net event

今、私は次のことをしています

...
tcp.on('connect',function(){ self.emit('connect');});
tcp.on('end',function(){ self.emit('end');});
...

あるモジュールから別のモジュールのクライアントにすべてのイベント(またはイベントのサブセット)を単純に転送する、より慣用的な方法はありますか?

こういうシナリオはいつも出てくると思いますので、できる限りクリーンにやりたいと思います。

4

2 に答える 2

3

私が過去にしたことは、イベントを処理することnewListenerです。クラスにハンドラーがアタッチされるまで、ハンドラーをアタッチする必要はありません。そして、そうなったら、基本クラスにアタッチします。

this.on('newListener', function (event, listener) {
    baseClassInstance.on(event, listener);
})

event最初にパラメータをチェックすることで、通過するイベントをフィルタリングできます。

リスナーを削除する必要がある場合は注意してください。このような場合、これは最善の解決策ではない可能性があります。

于 2012-09-24T02:38:15.817 に答える
0

私はそれを試したことがなく、現時点ではこれをテストすることはできませんが、次のことを試すことができます。

すべてのイベントを別のオブジェクトにプロキシする

tcp.emit = mymod.emit.bind(mymod);

イベントをプロキシし、独自に呼び出します。

var oldEmit = tcp.emit;

tcp.emit = function() { 
    mymod.emit.apply(mymod, arguments); 
    return oldEmit.apply(this, arguments);
}

それがうまくいくかどうか私に知らせてください!上記は概念実証に過ぎず、これを行うことの副作用については何も考えていません。

于 2012-09-24T00:14:58.583 に答える