2012-03-02 10 views
6

Estoy tratando de escribir una aplicación de sondeo simple, utilizando node.js. Quiero escribir un EventEmitter que realice una acción en un temporizador y emita eventos en función del resultado de esa acción periódica.node.js, método de devolución de llamada setTimeout y "this"

Estoy empezando por crear mi propio objeto y heredar de EventEmitter. Inicié un temporizador, usando setInterval, y especifico el método para llamar después de que el temporizador haya transcurrido. Dentro del método de devolución de llamada del temporizador, quiero hacer referencia a una variable del objeto que he creado, pero el this no parece referirse al objeto.

¿Cómo puedo hacer referencia a mi variable en este método? Aquí está mi código:

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; 

Respuesta

14

this.check es sólo una simple función, el valor de this dentro de esa función se determina cuando la función es llamada.

nodo debe apoyar bind por lo que puede obligar a la función a su deseada this así:

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

Como alternativa, puede utilizar un cierre para forzar manualmente this a ser lo que quieres:

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