![](/img/trans.png)
[英]Node.js EventEmitter function error `listener must be a function` when `typeof` returns function - could be scope issue
[英]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運行該函數。 當我放入監聽器_getQueue()時,它將運行該函數,但拋出一個錯誤(TypeError:listener必須是一個函數)。 我不確定我做錯了什么,因為我已經看到以這種方式編寫的其他代碼正在工作。
我已經驗證我使用this.on設置了監聽器('newListener'...)。 我假設因為我可以在更改偵聽器上的名稱時調用該函數,發射器也在執行它的工作。
請注意,使用requires從另一個文件調用此ticketGenerator函數。 我不知道這是否會影響這個問題的解決方案,但認為細節可能很重要。
---------------編輯----------------我在發布之后最終搞清楚這一點。 我需要調用構造函數來完成這些事件。 代碼如下所示。
events.EventEmitter.call(this);
由於代表我無法回答我自己的問題,但是我會盡快更新答案區域。
這是解決您不同問題的方法:
希望這可以幫助。
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');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.