2011-05-18 8 views
5

मैं यहाँ क्या गलत कर रहा हूं? मैं अपने कॉलबैक के लिए वसा तीर => का उपयोग कर रहा हूं, हालांकि जब कोड cb.onEndElement तक पहुंचता है और @returner को कॉल करता है तो मुझे एक शून्य ऑब्जेक्ट अपवाद मिलता है। तो @returner क्यों मौजूद नहीं है?कॉफीस्क्रिप्ट स्कोप मुद्दा

class Parser 
    constructor:() -> 
     @returner = (data) -> 

    searchParser: new xml.SaxParser (cb) => 
     cb.onStartElementNS (elem, attrs, prefix, url, ns) => 
      if elem is "results" then @results = [] 
      else if elem is "title" then @curr = "title" 
      else @curr = "none" 
     cb.onCdata (cdata) => 
      if @curr is "title" then @book.title = cdata 
     cb.onEndElementNS (elem, prefix, url) => 
      @results.push @book if elem is "book" 
     cb.onEndDocument => 
      @returner @results 

    search: (str, callback) -> 
     @returner = callback 
     @searchParser.parseString str 

p = new Parser 
p.search "somexml", (data) -> 
    console.log JSON.stringify data 
+0

क्या मेरा उत्तर आपकी समस्या का समाधान करता है? – nicolaskruchten

+0

हां, धन्यवाद। – Matthew

उत्तर

5

आपका विधि search एक की जरूरत है वसा में तीर => आदेश Parser के उदाहरण के लिए यह बाध्य करने में।

साथ ही, हालांकि लाइन searchParser: new xml.SaxParser (cb) => compiles, यह शायद नहीं कर रहा है कि आप क्या चाहते हैं, क्योंकि वसा तीर Parser और नहीं this को कॉलबैक बाध्यकारी है। आपके पास दो विकल्प हैं:

  1. आपको इसके बजाय अपने कन्स्ट्रक्टर में @searchParser = new xml.SaxParser (cb) => ... डालना चाहिए, जिस तरह से आप इसे कॉल कर रहे हैं।
  2. अन्यथा आप searchParser:() => new xml.SaxParser (cb) => इस्तेमाल कर सकते हैं और नीचे की तरफ कोष्ठक से कॉल करने की: @searchParser().parseString str, एक searchParser विधि this

करने के लिए बाध्य बनाने जो होगा एक उदाहरण के रूप में, यहाँ मेरे दो समाधान कर रहे हैं, साथ ही अपने मूल लाइन के रूप में, थोड़ा, सरलीकृत और साथ ही संकलित कोड, के लिए की तुलना और कॉन्ट्रास्ट प्रयोजनों: CoffeeScript में

सरलीकृत उदाहरण:

class Parser 
    constructor:() -> @searchParser1 = new xml.SaxParser (x) => console.log(x) 
    searchParser2:() => new xml.SaxParser (x) => console.log(x) 
    searchParser: new xml.SaxParser (x) => console.log(x) 

संकलित जावास्क्रिप्ट:

var Parser; 
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; 
Parser = (function() { 
    function Parser() { 
    this.searchParser2 = __bind(this.searchParser2, this);  
    this.searchParser1 = new xml.SaxParser(__bind(function(x) { 
     return console.log(x); 
    }, this)); 
    } 
    Parser.prototype.searchParser2 = function() { 
    return new xml.SaxParser(__bind(function(x) { 
     return console.log(x); 
    }, this)); 
    }; 
    Parser.prototype.searchParser = new xml.SaxParser(__bind(function(x) { 
    return console.log(x); 
    }, Parser)); 
    return Parser; 
}).call(this); 

नोट कैसे searchParser1 और searchParser2 उनके कॉलबैक this और searchParser के लिए बाध्य है Parser के लिए बाध्य है।

हमेशा के रूप में, कॉफीस्क्रिप्ट होमपेज पर "कॉफीस्क्रिप्ट का प्रयास करें" बटन (http://jashkenas.github.com/coffee-script/) आपका मित्र है!

3

सबसे पहले, जिस अवधारणा के बारे में आप बात कर रहे हैं वह "स्कोप" नहीं है- यह this है, जिसे अनौपचारिक रूप से "संदर्भ" भी कहा जाता है। और यह निश्चित रूप से जावास्क्रिप्ट (और इस प्रकार कॉफीस्क्रिप्ट) में सबसे कठिन अवधारणाओं में से एक है, भले ही नियम काफी सरल हैं। शायद ऐसा इसलिए है क्योंकि this शब्द, जो कि इसके अर्थ की तरह प्रतीत नहीं होता है, इस पर निर्भर करता है कि फ़ंक्शन को कैसे कहा जाता है ...

निकोलस का उत्तर मर चुका है, लेकिन मैं अनुशंसा करता हूं कि आप भी पढ़ लें this पर और => का उपयोग करने के बजाए इसे वास्तव में समझने की कोशिश करें (यह एक अच्छा टूल है, लेकिन हमेशा सही नहीं है)। कुछ संसाधनों मेरा सुझाव है:

  • जावास्क्रिप्ट गार्डेन्स section on this
  • कैसे नोड के लेख को What is this?
  • मेरी किताब, CoffeeScript: Accelerated JavaScript Development (एक बेशर्म प्लग, हाँ, लेकिन यह this, साथ ही गुंजाइश, व्याख्या नहीं करता एक में गहराई की उचित मात्रा)
संबंधित मुद्दे