2012-03-02 47 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該函數內部的值。

節點應該支持bind這樣你就可以將功能綁定到你想要的this這樣的:

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

或者,你可以使用一個閉合手動強制this是你想要的東西:

var self = this; 
this.interval_id = timers.setTimeout(function() { self.check() }, 1000);