Node.JS EventEmitter监听器必须是一个函数

尝试在函数中设置侦听器时出现错误。 我已经回顾了其他代码,这可以工作,但似乎无法得到它为我的目的工作。

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

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的function。 当我放入监听器_getQueue()它将运行该函数,但引发错误(TypeError:监听器必须是一个函数)。 我不知道我在做什么错误,因为我看过用这种方法编写的其他代码。

我已经validation,我有听众设置this.on('newListener'…)。 我假设,因为我可以调用函数,当更改发件人正在做的侦听器的名称也是工作。

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

—————编辑—————-我发布了这个后,我最终搞清楚了这一点。 我需要调用这些事件的构造函数才能通过。 代码如下所示。

 events.EventEmitter.call(this); 

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

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

  • 在你的示例中,self将与窗口或全局名称空间相关联。 您无法使用此function访问您的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');