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

Node.JS EventEmitter Listener Must be a Function

本文关键字:一个 函数 EventEmitter JS Listener Node      更新时间:2023-09-26

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

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

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');