2012-03-02 5 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);