2012-03-02 20 views
6

node.js. kullanarak basit bir oylama uygulaması yazmaya çalışıyorum. Bir zamanlayıcıda bir eylem gerçekleştiren ve o periyodik eylemin sonucuna göre olayları yayan bir EventEmitter yazmak istiyorum.node.js, setTimeout geri arama yöntemi ve "this"

Kendi nesneyi oluşturarak ve EventEmitter'dan devralarak başlıyorum. Bir zamanlayıcıyı setInterval kullanarak başlatıyorum ve zamanlayıcı geçtikten sonra çağrılacak yöntemi belirtiyorum. Zamanlayıcı geri çağırma yöntemi içinde, yarattığım nesnenin bir değişkenine başvurmak istiyorum, ancak this nesneye başvurmuyor.

Değişkenimi bu yöntemde nasıl referans alabilirim?

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; 

cevap

14

this.check sadece basit işlevi, işlev çağrıldığında belirlenecektir o işlevi içinde this değeridir: İşte benim kodudur. Alternatif

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

, el istediğini olmak this zorlamak için bir kapatma kullanabilirsiniz::

Düğüm bind yüzden böyle this istenen senin fonksiyonu bağlayabilir desteklemelidir

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