2012-03-02 6 views
6

node.jsを使用して単純なポーリングアプリケーションを作成しようとしています。私はタイマーでアクションを実行し、その定期的なアクションの結果に基づいてイベントを発生させるEventEmitterを書きたいと思っています。node.js、setTimeoutコールバックメソッドと "this"

私は自分のオブジェクトを作成し、EventEmitterから継承し始めています。私は、setIntervalを使ってタイマーを開始し、タイマーが経過した後に呼び出すメソッドを指定します。タイマーコールバックメソッド内で、私が作成したオブジェクトの変数を参照したいが、thisはオブジェクトを参照していないようだ。

この方法で変数を参照するにはどうすればよいですか?ここに私のコードは次のとおりです。

var util = require('util'), 
    events = require('events'), 
    timers = require('timers'), 
    redis = require('redis'); 


// define worker object 

var JobPoller = function() { 

    // inherit event emitter 
    events.EventEmitter.call(this); 

    // save reference to database 
    this.db = redis.createClient(); 

    // start main loop 
    this.interval_id = timers.setTimeout(this.check, 1000); 

}; 


JobPoller.prototype.check = function() { 

    // pop a job off the queue if possible 
    this.db.rpop('pdf-job-queue', function (err, result) { 

     if (err != null) 
      this.emit('error', err); 

     if (result != null) 
      this.emit('job', JSON.parse(result)); 

     // check for more jobs 
     this.interval_id = timers.setTimeout(this.check, 1000); 

    }); 

}; 


// inhert from event emitter 

util.inherits(JobPoller, events.EventEmitter); 


// export the poller instance 

module.exports = new JobPoller; 

答えて

14

this.checkは、関数が呼び出されたときに、その関数の内部thisの値が決定され、単純な機能です。また

this.interval_id = timers.setTimeout(this.check.bind(this), 1000); 

、あなたは手動であなたが望むものであることをthisを強制的に閉鎖を使用することができます:

ノードがbindはそうあなたがこのようなthisを希望あなたに関数をバインドすることができますサポートしている必要があり

var self = this; 
this.interval_id = timers.setTimeout(function() { self.check() }, 1000); 
関連する問題