2013-04-15 12 views
6

मुझे फ़ंक्शन के भीतर श्रोताओं को सेट करने का प्रयास करते समय त्रुटि हो रही है। मैंने अन्य कोड की समीक्षा की है जो यह काम करता है, लेकिन ऐसा लगता है कि यह मेरे उद्देश्यों के लिए काम नहीं कर रहा है।नोड.जेएस इवेंटइमीटर श्रोता एक फंक्शन होना चाहिए

यह एक सरल संस्करण है जिसे मैं करने का प्रयास कर रहा हूं।

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: श्रोता एक फ़ंक्शन होना चाहिए)। मुझे यकीन नहीं है कि मैं क्या गलत कर रहा हूं क्योंकि मैंने इस तरह से लिखा गया अन्य कोड देखा है जो काम कर रहा है।

मैंने सत्यापित किया है कि मेरे पास श्रोताओं के साथ सेटअप है। ('NewListener'।)। मुझे लगता है कि जब से श्रोता पर नाम बदलते हैं तो मैं इसे फ़ंक्शन कॉल करने के लिए प्राप्त कर सकता हूं क्योंकि एमिटर भी यह काम कर रहा है।

ध्यान दें कि यह टिकट जेनरेटर फ़ंक्शन को आवश्यकतानुसार किसी अन्य फ़ाइल से बुलाया जा रहा है। मुझे नहीं पता कि इससे इस मुद्दे के समाधान को प्रभावित किया जाएगा, लेकिन यह पता चला कि विस्तार महत्वपूर्ण हो सकता है।

--------------- संपादित करें ---------------- मैंने इसे पोस्ट करने के बाद इसे समझ लिया। मुझे इन घटनाओं के माध्यम से जाने के लिए एक कन्स्ट्रक्टर को कॉल करने की आवश्यकता थी। कोड निम्न जैसा दिखता है।

events.EventEmitter.call(this); 

मैं प्रतिनिधि के कारण अपने स्वयं के प्रश्न का उत्तर नहीं दे सका, लेकिन जब मैं कर सकता हूं तो उत्तर क्षेत्र अपडेट कर दूंगा।

+4

क्या आप टिकट निर्माता को 'नया' के साथ बुला रहे हैं? इवेंटइमीटर से वास्तव में आपका कोड कहां प्राप्त होता है? आपके सेटटाइमआउट में भी 'नया' नहीं है, इसलिए आपका 'यह' मान वह नहीं है जो आप चाहते हैं। –

+2

आप जानते हैं कि आप इस पर हुक करने से पहले घटना को उत्सर्जित कर रहे हैं? – Bergi

+0

आम गलती। मैं इवेंट एमिटर का उपयोग न करने के कुछ महीनों के बाद ऐसा करता हूं। – EhevuTov

उत्तर

1

यहाँ अपनी समस्याओं के विभिन्न के लिए एक समाधान है:

  • अपने नमूने में, स्वयं खिड़की या वैश्विक नामस्थान साथ संबद्ध किया जाएगा। इसका उपयोग करके आप अपने EventEmitter तक पहुंचने का कोई तरीका नहीं है।
  • श्रोता को जोड़ने से पहले आप पहली getQueue ईवेंट उत्सर्जित करते हैं। आपको अपने टिकट जेनरेटर को तुरंत चालू करना होगा और फिर पहिया शुरू करने के लिए पहले getQueue को उत्सर्जित करना होगा।
  • आपके टाइमआउट में, पुनः प्रयास करने के लिए बस एक नया getQueue उत्सर्जित करने की आवश्यकता है, फिर से टिकट जेनरेटर को तुरंत चालू करने की आवश्यकता नहीं है।

उम्मीद है कि इससे मदद मिलती है।

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'); 
संबंधित मुद्दे