簡體   English   中英

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運行該函數。 當我放入監聽器_getQueue()時,它將運行該函數,但拋出一個錯誤(TypeError:listener必須是一個函數)。 我不確定我做錯了什么,因為我已經看到以這種方式編寫的其他代碼正在工作。

我已經驗證我使用this.on設置了監聽器('newListener'...)。 我假設因為我可以在更改偵聽器上的名稱時調用該函數,發射器也在執行它的工作。

請注意,使用requires從另一個文件調用此ticketGenerator函數。 我不知道這是否會影響這個問題的解決方案,但認為細節可能很重要。

---------------編輯----------------我在發布之后最終搞清楚這一點。 我需要調用構造函數來完成這些事件。 代碼如下所示。

events.EventEmitter.call(this);

由於代表我無法回答我自己的問題,但是我會盡快更新答案區域。

這是解決您不同問題的方法:

  • 在您的示例中,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');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM