1

nodejs イベント システムを使用しているときに、厄介な問題に遭遇しました。以下のコードが示すように、リスナーがイベントをキャッチすると、イベント エミッター オブジェクトは、リスナーの代わりにコールバック関数で「this」を所有します。

リスナーのコンストラクターにコールバックを配置しても大きな問題にはなりません。これは、ポインター 'this' の他に、コンストラクターのスコープで定義された他の変数 ('self' や 'that' など) を引き続き使用できるためです。

しかし、コールバックがプロトタイプ メソッドのようにコンストラクタの外にある場合、リスナーの「this」を取得する方法がないように思えます。

他に解決策があるかどうかはよくわかりません。また、nodejs イベント エミットがエミッターをリスナーの呼び出し元インストールとして使用する理由について少し混乱していますか?

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

var listener = function () {
    var pub = new publisher();
    var self = this;
    pub.on('ok', function () {
        console.log('by listener constructor this: ', this instanceof listener);
        // output: by listener constructor this:  false

        console.log('by listener constructor self: ', self instanceof listener);
        // output: by listener constructor this:  true
    })
    pub.on('ok', this.outside);
}

listener.prototype.outside = function () {
    console.log('by prototype listener this: ', this instanceof listener);
    // output: by prototype listener this:  false
    // how to access to listener's this here?
}

var publisher = function () {
    var self = this;

    process.nextTick(function () {
        self.emit('ok');
    })
}

util.inherits(publisher, EventEmitter);

var l = new listener();
4

1 に答える 1

5

リスナーを明示的にコールバックにバインドしてみてください。

pub.on('ok', this.outside.bind(this));
于 2013-03-21T10:22:08.840 に答える