gpt4 book ai didi

javascript - node.js,setTimeout回调方法和 "this"

转载 作者:数据小太阳 更新时间:2023-10-29 04:30:22 25 4
gpt4 key购买 nike

我正在尝试使用 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;

最佳答案

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

Node 应该支持bind所以你可以像这样将函数绑定(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);

关于javascript - node.js,setTimeout回调方法和 "this",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9527911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com