Node.js、setTimeout 回调函数和 "this"

8

我试图使用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个回答

15

this.check是一个简单的函数,该函数内部的this值将在调用函数时确定。

Node应该支持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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接