2013-04-15 16 views
6

Bir işlev içinde dinleyicileri ayarlamaya çalışırken bir hata alıyorum. Bunun için çalıştığı başka bir kodu inceledim, ancak amacım için işe yaramayacak gibi görünmüyor.Node.JS EventEmitter Dinleyicisi Fonksiyonu Olmalıdır

Bu, benim yapmaya çalıştığım şeyin basitleştirilmiş bir sürümüdür.

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 işlevini çalıştırmak için alamıyorum. Dinleyiciye _getQueue() öğesini koyduğumda, işlevi çalıştıracak, ancak bir hata atar (TypeError: dinleyici bir işlev olmalıdır). Çalıştığım şekilde yazılmış başka bir kod gördüğümden, yanlış yaptığımdan emin değilim.

This.on ('newListener'...) Ile birlikte dinleyici kurulumunu yaptığımı doğruladım. Emitörün ismini değiştirirken dinleyicide adı değiştirirken, işlevi çağırmak için onu alabildiğimi düşünüyorum.

Bu ticketGenerator işlevinin, kullanarak başka bir dosyadan çağrıldığını unutmayın. Bunun bu sorunun çözümünü etkileyip etkilemeyeceğini bilmiyorum, ancak detayın önemli olabileceğini düşündüm.

--------------- DÜZENLEME ---------------- Bunu yayınladıktan sonra bunu anladım. Bu olayların yapılabilmesi için bir kurucu çağırmam gerekiyordu. Kod aşağıdaki gibi görünüyor.

events.EventEmitter.call(this); 

Yetkisine bağlı olarak kendi sorumu yanıtlayamadım, ancak yapabileceğim zaman yanıt alanını güncelleyeceğim.

+4

'Yeni' ile ticketGenerator'ı mı arıyorsunuz? Kodunuzun EventEmitter'den devralması nerede? Ayrıca setTimeout'unuzda 'new' yoktur, yani' this' değeriniz istediğiniz gibi değildir. –

+2

Olayı çıldırmadan önce mi yayıyorsunuz biliyor musunuz? – Bergi

+0

Yaygın bir hata. Olay Vericisini kullanmamadan birkaç ay sonra bunu yapıyorum. – EhevuTov

cevap

1

İşte senin sorunlarına farklı çözüm var: sizin örnekte

  • , kendinden penceresi veya genel ad ile ilişkilendirilir. Bunu kullanarak EventEmitter'ınıza erişmenin bir yolu yoktur.
  • Bir dinleyici eklemeden önce ilk getQueue olayını yayarsınız. TicketGenerator'unuzu başlatmalı ve ardından tekerleği başlatmak için ilk getQueue'u yamalısınız.
  • Zaman aşımınızda, yeniden denemek için yeni bir getQueue göndermeniz gerekir, TicketGenerator'ı yeniden başlatmanız gerekmez.

Bu yardımcı olur umarım.

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