2012-03-02 67 views
6

Próbuję napisać prostą aplikację do głosowania, używając node.js. Chcę napisać EventEmitter, który wykonuje akcję na czasomierzu i emituje zdarzenia w oparciu o wynik tego okresowego działania.node.js, metoda wywołania zwrotnego setTimeout i "to"

Zaczynam od utworzenia własnego obiektu i dziedziczenia z EventEmitter. Uruchamiam timer za pomocą setInterval i określam metodę wywołania po upływie czasu. W metodzie wywołania zwrotnego licznika chcę odwołać się do zmiennej obiektu, który utworzyłem, ale this nie wydaje się odnosić do obiektu.

Jak mogę odwołać się do mojej zmiennej w tej metodzie? Tu jest mój kodu:

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; 

Odpowiedz

14

this.check jest tylko prosta funkcja, wartość this wewnątrz tej funkcji zostanie ustalona, ​​gdy funkcja jest wywoływana.

Węzeł powinien wspierać bind więc można powiązać funkcję żądany this takiego:

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

Alternatywnie, można użyć zamknięcia wymusić this się, co chcesz:

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