gpt4 book ai didi

javascript - Node.JS EventEmitter Listener 必须是一个函数

转载 作者:数据小太阳 更新时间:2023-10-29 05:36:26 24 4
gpt4 key购买 nike

尝试在函数内设置监听器时出现错误。我已经审查了它适用的其他代码,但似乎无法让它为我的目的工作。

这是我试图完成的工作的简化版本。

var ticketGenerator = function(){
var self = this;
console.log('ticket generator');
var rows = "";
this.emit("getQueue")

var _getQueue = function(){
console.log('Getting Queue');
var connection = mysql.createConnection({
//Connection Data
});
connection.connect();
connection.query("SELECT * FROM `queue` WHERE `run` = 0 ORDER BY `queueID` ASC LIMIT 1", function(err, rows, fields){
if(err){
//self.emit("error", "Unable to get data from the database.")
console.log(err);
}
else if(typeof rows[0] == "undefined"){
console.log("Waiting to run again.");
connection.end();
setTimeout(function(){ticketGenerator()}, 60000);
}
else{
console.log("Passing Ticket Data");
self.emit("newTicketData", rows);
connection.end();
}
})
};

this.on("getQueue", _getQueue);
}

我无法让它运行 _getQueue 的函数。当我放入监听器 _getQueue() 时,它将运行该函数,但会抛出错误(TypeError:监听器必须是一个函数)。我不确定我做错了什么,因为我看到其他以这种方式编写的代码正在运行。

我已经验证我已经使用 this.on('newListener' . . .) 设置了监听器。我假设因为我可以让它在更改监听器上的名称时调用该函数,所以发射器也在做它的工作。

请注意,此 ticketGenerator 函数是使用 requires 从另一个文件调用的。我不知道这是否会影响此问题的解决方案,但认为细节可能很重要。

----------------编辑----------------发布此消息后,我最终弄清楚了这一点。我需要为这些事件调用一个构造函数来完成。代码如下所示。

events.EventEmitter.call(this);

由于代表的原因,我无法回答我自己的问题,但会尽可能更新答案区域。

最佳答案

以下是针对您的不同问题的解决方案:

  • 在您的示例中,self 将与窗口或全局命名空间相关联。您无法使用它访问您的 EventEmitter。
  • 您在附加监听器之前发出第一个 getQueue 事件。您必须实例化 TicketGenerator,然后发出第一个 getQueue 以启动轮子。
  • 在超时时,只需发出一个新的 getQueue 来重试,无需再次实例化 TicketGenerator。

希望这对您有所帮助。

TicketGenerator = function() {
var self = this;
console.log('ticket generator');
var rows = "";

EventEmitter.call(this);

var _getQueue = function() {
console.log('Getting Queue');
var connection = mysql.createConnection({
//Connection Data
});
connection.connect();
connection.query("SELECT * FROM `queue` WHERE `run` = 0 ORDER BY `queueID` ASC LIMIT 1", function(err, rows, fields){
if(err){
//self.emit("error", "Unable to get data from the database.")
console.log(err);
}
else if(typeof rows[0] == "undefined"){
console.log("Waiting to run again.");
connection.end();
setTimeout(function(){
self.emit('getQueue');
}, 60000);
}
else {
console.log("Passing Ticket Data");
self.emit("newTicketData", rows);
connection.end();
}
});
}

this.on("getQueue", _getQueue);
};

// Instantiate the ticket generator and initiate the first queue retrieval
var ticketGenerator = new TicketGenerator();
ticketGenerator.emit('getQueue');

关于javascript - Node.JS EventEmitter Listener 必须是一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16025844/

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