Rya*_*yan 7 javascript timer callback node.js
我正在尝试使用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;
Run Code Online (Sandbox Code Playgroud)
mu *_*ort 14
this.check只是一个简单的函数,函数this内部的值将在调用函数时确定.
Node应该支持bind所以你可以将函数绑定到你想要的函数,this如下所示:
this.interval_id = timers.setTimeout(this.check.bind(this), 1000);
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用闭包手动强制this成为您想要的:
var self = this;
this.interval_id = timers.setTimeout(function() { self.check() }, 1000);
Run Code Online (Sandbox Code Playgroud)