node.js, метод обратного вызова setTimeout и «this» - PullRequest
7 голосов
/ 02 марта 2012

Я пытаюсь написать простое приложение для опроса, используя NodeJS.Я хочу написать EventEmitter, который выполняет действие с таймером и генерирует события, основанные на результате этого периодического действия.

Я начинаю с создания своего собственного объекта и наследования от 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);
    });
};

// inherit from event emitter
util.inherits(JobPoller, events.EventEmitter);

// export the poller instance
module.exports = new JobPoller;

1 Ответ

14 голосов
/ 02 марта 2012

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...