Node.JS EventEmitter Listener必须是一个函数
Node.JS EventEmitter Listener Must be a Function
尝试在函数内设置侦听器时出现错误。我已经审查了其他代码,这工作,但似乎不能让它为我的目的工作。
这是我试图完成的事情的简化版本。
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的函数。当我放入listener _getQueue()时,它将运行函数,但会抛出一个错误(TypeError: listener必须是一个函数)。我不确定我做错了什么,因为我看到过以这种方式编写的其他代码正在工作。
我已经验证了我已经用这个设置了侦听器。on('newListener'…). 我假设,既然我可以让它在更改侦听器上的名称时调用该函数,那么发射器也在做它的工作。
注意,这个ticketGenerator函数是使用require从另一个文件调用的。我不知道这是否会影响这个问题的解决方案,但我认为这个细节可能很重要。
--------------- 编辑 ----------------在我发布这个之后,我终于弄清楚了这一点。我需要调用构造函数来处理这些事件。代码如下所示。
events.EventEmitter.call(this);
由于rep的关系,我无法回答自己的问题,但我会在可能的时候更新答案区域。
这里有一个不同问题的解决方案:
- 在示例中,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');
相关文章:
- 我可以在json对象中添加一个函数吗
- 如何在JQuery函数中定义一个值,然后调用另一个函数并使用该值
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 在另一个函数中使用变量this
- 在另一个函数成功结束后调用该函数
- mongoose.connect undefined不是一个函数
- 监听器必须是一个函数
- 使用JS函数来使用另一个函数的语法?node.js
- 如何取消object.prototypes javascript的一个函数
- 从Chrome扩展名中的popup.html文件在background.js文件中运行一个函数
- 嵌套到另一个函数中的Fancybox函数;不起作用
- 如何在javascript中使用不止一个函数
- jQuery-在页面加载时执行一个函数
- jquery UI draggable:UI.children不是一个函数
- jQuery Mobile Undefined不是一个函数
- 如何在php中创建一个函数,该函数与文本区域一起工作,通过输入类似[color:red]的内容来打印具有等效颜色的文本
- javascript函数将数据添加到屏幕,但随后被另一个函数覆盖
- JS异常:animate不是一个函数
- 如何将一个函数附加到一个不存在的元素上
- JavaScript/jQuery-添加添加和删除类与下一个函数之间的延迟