2017-11-01 19 views
0

イベントが頻繁にトリガされているSPAの問題を追跡しようとしています。そのことを念頭に置いて、私はノードのeventEmitter.on関数をオーバーライドして、いくつかのログインを追加してから元のものを呼び出すことにしました。ノードeventEmitter.onをロギングのクロージャでオーバーライドすると

// Ignore `state` here but it essentially means I can access `eventEmitter` all over my app. 
var EventEmitter = ('events') 
state.eventEmitter = new EventEmitter() 
state.eventEmitter.on = (function (original) { 
    return function (name, callback) { 
     console.log('On Called for %s', name) 
     original(name, callback) 
    } 
})(state.eventEmitter.on) 

これが動作していない:これはSO https://stackoverflow.com/a/10427757/261682window.alertをオーバーライドして、私は次のコードを思いついた程度で、この答えに私をリードしています。イベントはまったくトリガーされず、コンソールに何も表示されません。

私は間違っていますか?

注:私の元の問題を追跡する他の方法がありますが、上記のコードが機能しない理由については興味があります。

答えて

1

私はあなたのコードを試してみましたが、私はそれを実行すると、私は次のエラーを取得するのに、それは主に、正常に見える:

Cannot read property '_events' of undefined持つEventEmitter

の内部エラーの方法は、あなたが元.on()関数を渡すためです呼び出されるとコンテキスト(この引数)が失われます。

これを避けるには、state.eventEmitter.on.bind(state.eventEmitter)を呼び出してイベントエミッタへの関数をバインドします。私はまた、on()が連鎖可能なので、元の関数の結果を返すのを忘れていることに気づいた。

さらに、誰もイベントをリッスンしていない場合は、オーバーライドされた関数も呼び出されません。

はこここれにより

var EventEmitter = require('events'); 
state.eventEmitter = new EventEmitter(); 
state.eventEmitter.on = (function (original) { 
    return function (name, callback) { 
     console.log('On Called for %s', name); 
      return original(name, callback); 
     } 
})(state.eventEmitter.on.bind(state.eventEmitter)); 

state.eventEmitter.on('my_event', function() { 
    console.log('my_event has been called'); 
}); 

state.eventEmitter.emit('my_event'); 

上記の修正を加えたコードは、次の出力持っている:

On Called for my_event 
my_event has been called 
+0

それをやった、どうもありがとうございました。 – webnoob

関連する問題