2

私はこれにほぼ2時間苦労していますが、まだ取得できません.=(説明のために、次のコードを取得しました。

var util = require('util');
var events = require('events').EventEmitter;

function a (){
    //this is my first function
    var b_obj = new b();
    b_obj.on('event',function(){
        console.log('Something happened!');
    });
};

function b (){
    //this is my second function
    events.call(this);
    this.emit('event');
};

util.inherits(b, events);
a();

だから私がやろうとしているのは、「a」という関数を手に入れたということです。この関数は、「b」という 2 番目の関数を呼び出します。この関数は、一部のデータを検証し、検証の結果に応じてイベントを発行します。

私が見つけたのは、リスナーが正常に動作し、イベントが正しく発行されていることです。しかし、イベントは関数 b のコンテキストで発行され、リスナーは関数 a のコンテキストで動作するように見えます。さらに調査するために、次の行を関数 b に追加しました。

this.on('event', function(){
        console.log('event emitted!');
    });

そして、これは機能します。誰でも私を助けることができますか?解決策は非常に簡単だと確信しています。=(

4

2 に答える 2

-1

イベント ハンドラー関数は、イベントを発行するオブジェクトのコンテキストで常に呼び出されます (この場合は ) b。あなたの例では、単に行うことができます

function a() {
  var self = this;

  ...
}

のコンテキストを覚えていaますが、実際のコードは異なり、イベントハンドラーをクロージャーとして指定していない可能性があるため、代わりにハンドラーを設定する前に目的のオブジェクトにバインドできます。

function a (){
    //this is my first function
    var b_obj = new b();
    b_obj.on('event', handlerFunction.bind(this));
}

この場合、 your handlerFunctionwill は常に のコンテキストで呼び出されますa。このbindメソッドは、指定したオブジェクトにバインドされた新しい関数を返します。Mozilla のドキュメントを参照してください。

PS。今後投稿する前に、質問をより明確に表現し、より良い例を提供することをお勧めします。

于 2014-12-20T15:10:40.813 に答える