2016-11-16 13 views
1

最近追加されたリスナーを除くすべてのリスナーを削除する方法を探してください。最新のものを除くすべてのイベントエミッタリスナーを削除します。

のでprocess.stdinのために、私たちは、私は、コールバックAおよびBを削除しますが、Cを残したい

process.stdin.on('readable',function a(){}); 
process.stdin.on('readable',function b(){}); 
process.stdin.on('readable',function c(){}); 

を行う可能性があります。

ただし、この場合には、私がまたはbへの参照を持っていない、私のような何かやりたい:

while(process.stdin.listenerCount('readable') > 1){ 
    process.stdin.removeListener('readable'); 
} 

を私はあなたがで関数を渡す必要があると思う。この周りの任意の方法。 ?

+1

リスナーを削除する場合は、追加時に使用された関数を渡す必要があります。また、関数が必要なので、匿名関数にすることはできません。共通スコープで宣言された名前付き関数でなければなりません。 – jfriend00

+0

あなたは間違いなく正しいです。 2番目の引数としてremoveListener( 'event-name')を呼び出すと、最も古いリスナーが配列外にポップされてしまうのではないかと思って変わったようです。 –

+0

奇妙なことですか?私はそうは思わない。それはコーディングの完全性の事です。関数への参照がない場合は、リスナーを削除することはできません。エミッタは、自分のコード内だけでなく、多くの外部コードを使用するように設計されています。リスナー参照を保存する '.on()'のために独自のオーバーライドをラップすることができるので、必要に応じてハンドラを削除することができます。それを実装するのは難しくありません。 – jfriend00

答えて

1

eventEmitter.listeners()で特定のイベントのハンドラのコピーを取得できます。しかし、あなたは本当に特定の順序でそれらに頼るべきではありません。ここで

は、現在動作するものなソリューションです:

process.stdin.listeners('readable').forEach(function(fn) { 
    if (process.stdin.listenerCount('readable') > 1) 
    process.stdin.removeListener('readable', fn); 
}); 

保存しておきたい1つの関数の名前を知っている場合は、あなただけではなく、同じように、代わりにfn.nameに分岐することができます。

process.stdin.listeners('readable').forEach(function(fn) { 
    if (fn.name !== 'c') 
    process.stdin.removeListener('readable', fn); 
}); 

これらのリスナーを'readable'イベントハンドラから削除すると、他のリスナーはその特定のイベントに対して呼び出されますが、今後のイベントは呼び出されないことにも注意してください。これは、イベント名のリスナーが、.emit()の間に呼び出される前に複製されるためです。

関連する問題