2012-07-11 8 views
9

अनुरोध करने के लिए मैंने एक नोड स्क्रिप्ट लिखी है जिसे REST API डेटा (लाइब्रेरी अनुरोध का उपयोग करके) का अनुरोध करके कुछ डेटा प्राप्त होता है। यह इतना जैसे कार्यों की एक जोड़ी के होते हैं:एसिंक जैसे नोड पुस्तकालयों के साथ 'इस' समस्याओं को हल करने और

var data = { /* object to store all data */ }, 
function getKloutData() { 
    request(url, function() { /* store data */} 
} 
// and a function for twitter data 

क्योंकि मैं प्राप्त करने में कठिनाई के बाद कुछ सामान करना चाहते हैं सब मैं पुस्तकालय async इस्तेमाल किया चलाने के लिए सब तो जैसे कार्यों लाने:

async.parallel([ getTwitterData, getKloutData ], function() { 
    console.log('done'); 
}); 

यह सब ठीक काम करता है, फिर भी मैं एक वस्तु पैटर्न के अंदर सब कुछ डाल करने के लिए तो मैं एक ही समय में एक से अधिक खातों लाने सकता है चाहता था:

function Fetcher(name) { 
    this.userID = '' 
    this.user = { /* data */ } 
    this.init(); 
} 
Fetcher.prototype.init = function() { 
    async.parallel([ this.getTwitterData, this.getKloutData ], function() { 
     console.log('done'); 
    }); 
} 
Fetcher.prototype.getKloutData = function(callback) { 
    request(url, function() { /* store data */ }); 
}; 

इसका कारण यह है async काम नहीं करता है और यह परिवर्तन का अनुरोध संदर्भ।

Fetcher.prototype.init = function() { 
    async.parallel([ this.getTwitterData.bind(this), this.getKloutData.bind(this) ], function() { 
     console.log('done'); 
    }); 
} 
Fetcher.prototype.getKloutData = function(callback) { 
    function saveData() { 
     /* store data */ 
    } 


    request(url, saveData.bind(this); 
}; 

मैं कुछ बुनियादी गलत या कुछ कर रहा हूँ: एक ही रास्ता मैं इसे चारों ओर हो सकता है async और अनुरोध के माध्यम से सब कुछ मैं पारित जुड़ कर रहा है? मुझे लगता है कि स्क्रिप्ट पर वापस आना और इसे child_processes को फेंकना बहुत अधिक है।

उत्तर

9

आप इसे ठीक से कर रहे हैं।

विकल्प के बजाय bind का उपयोग कर के संदर्भ में हमेशा वस्तु के लिए एक संदर्भ रखने के लिए है, लेकिन है कि कुछ जिमनास्टिक की आवश्यकता है:

Fetcher.prototype.init = function() { 
    var self = this; 
    async.parallel([ 
     function(){ return self.getTwitterData() }, 
     function(){ return self.getKloutData() } 
    ], function() { 
     console.log('done'); 
    }); 
} 

Fetcher.prototype.getKloutData = function(callback) { 
    var self = this; 

    function saveData() { 
     // store data 
     self.blah(); 
    } 

    request(url, saveData); 
}; 

तुम भी पहले से बाध्यकारी कर सकते हैं:

Fetcher.prototype.bindAll = function(){ 
    this.getKloutData = this.prototype.getKloutData.bind(this); 
    this.getTwitterData = this.prototype.getTwitterData.bind(this); 
}; 

Fetcher.prototype.init = function(){ 
    this.bindAll(); 
    async.parallel([ this.getTwitterData, this.getKloutData ], function() { 
     console.log('done'); 
    }); 
}; 
+3

अंडरस्कोर पुस्तकालय एक आसान समारोह bindAll' कहा जाता है कि इस 'कम दर्दनाक बनाता है। और यदि आप कॉफीस्क्रिप्ट का चयन करते हैं, तो आप केवल वसा तीर के साथ विधियों को परिभाषित कर सकते हैं और आपको बिल्कुल स्पष्ट बाध्यकारी नहीं करना पड़ेगा। –

3

आप अन्य चर में इस बचा सकते हैं:

var me = this; 

फिर me अपने this है।

0

इस फ़ंक्शन के साथ इंस्टेंटिएट ऑब्जेक्ट:

function newClass(klass) { 
    var obj = new klass; 

    $.map(obj, function(value, key) { 
     if (typeof value == "function") { 
      obj[key] = value.bind(obj); 
     } 
    }); 

    return obj; 
} 

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

तो तुम दृष्टांत आप के माध्यम से नहीं वस्तुओं:

var obj = new Fetcher(); 

लेकिन:

var obj = newClass(Fetcher); 
+0

मेरा मूल प्रश्न एक नोडज पर्यावरण में था जहां jQuery समझ में नहीं आता है। अंडरस्कोर और लॉनाश (सभी जेएस वातावरण में काम कर रहे libs) में 'bindAll' विधियां भी आपके लिए ऐसा करने के लिए डिज़ाइन की गई हैं। – askmike

संबंधित मुद्दे