node.js, метод обратного вызова setTimeout и «this»

Я пытаюсь написать простое приложение для опроса с использованием 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;
7
задан pushkin 28 November 2018 в 23:21
поделиться