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();