2013-04-15 2 views
6

Я получаю сообщение об ошибке при попытке настроить слушателей внутри функции. Я рассмотрел другой код, для которого это работает, но не может заставить его работать для моих целей.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. Когда я помещаю в слушатель _getQueue(), он запускает эту функцию, но выдает ошибку (TypeError: listenener должен быть функцией). Я не уверен, что я делаю неправильно, так как видел другой код, написанный таким образом, который работает.

Я проверил, что у меня есть настройки слушателей с this.on ('newListener' ...). Я предполагаю, что, поскольку я могу заставить его вызвать функцию при изменении имени на слушателе, что эмиттер делает это тоже.

Обратите внимание, что эта функция Tickener-кода вызывается из другого файла, используя требуемые. Я не знаю, повлияет ли это на решение этой проблемы, но подумал, что детали могут быть важными.

--------------- EDIT ---------------- Я закончил тем, что понял это после того, как я разместил это. Мне нужно было вызвать конструктор для этих событий. Код выглядит следующим образом.

events.EventEmitter.call(this); 

Я не мог ответить на мой собственный вопрос из-за репутации, но будет обновлять область ответа, когда я могу.

+4

Вы хотите заказать билетгенератор с 'новым'? Где ваш код действительно наследуется от EventEmitter? Также в вашем setTimeout нет 'new', поэтому ваше значение' this' не то, что вы хотите. –

+2

Вы знаете, что вы излучаете событие, прежде чем подключаться к нему? – Bergi

+0

Общая ошибка. Я делаю это через несколько месяцев, не используя Event Emitter. – EhevuTov

ответ

1

Вот решение отличается от ваших проблем:

  • В вашей выборке, само будет связан с окном или глобальное пространство имен. Нет никакого способа получить доступ к вашему 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'); 
Смежные вопросы