尝试在函数中设置侦听器时出错。我已经审查了其中适用的其他代码,但似乎无法使其适用于我的目的。
这是我试图完成的简化版本。
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:listener必须是一个函数)。我不确定我做错了什么,因为我已经看到以这种方式编写的其他代码正在工作。
我已经验证我使用this.on设置了侦听器('newListener'...)。我假设因为我可以在更改侦听器上的名称时调用该函数,发射器也在执行它的工作。
请注意,使用requires从另一个文件调用此ticketGenerator函数。我不知道这是否会影响这个问题的解决方案,但认为细节可能很重要。
--------------- EDIT ---------------- 在我发布之后我最终搞清楚了。我需要调用构造函数来完成这些事件。代码如下所示。
events.EventEmitter.call(this);
由于代表我无法回答我自己的问题,但我会尽快更新答案区域。
答案 0 :(得分:1)
以下是解决您不同问题的方法:
希望这有帮助。
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');