2014-05-09 3 views
7

मैं कुछ JSON फ़ीड खींचने के लिए एक Angular.js सेवा लिख ​​रहा हूँ की श्रृंखला अज्ञात संख्या के लिए कैसे। प्रारंभ में, सेवा नहीं जानता कि कौन से संसाधन अनुरोध करने के लिए; वे एक अन्य अनुरोध द्वारा लौटाए गए आईडी पर निर्भर हैं।जावास्क्रिप्ट कोणीय: वादों

मैं सिर में दर्द $http सेवा अनुरोध एक साथ चेन हो रही है। क्या ऐसा करने के लिए एक सामान्य रूप से इस्तेमाल किया पैटर्न है?

मैं Array.reduce तकनीक एक और धागा पर सुझाव की कोशिश की है, लेकिन आईडी और अनुरोध किया डेटा सिंक कर समस्या थी।

यह मेरे पास अब तक है। क्या किसी के पास कोई सुझाव है?

aService.factory('dummy', function($http){ 
    // Dummy resources. 
    var resources = [ 
     'http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js', 
     'http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js', 
     'http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js' 
    ]; 
    return { 
     data: function(callback){ 

      var jquerySources = [] 

      var promiseChain = $http({method: 'GET', url: resources[0]}); 
      var l = resources.length 
      for (var i = 1; i < l; i++){ 
       promiseChain.then(function(data){ 

        jquerySources.push({ 
         url: resources[i], 
         source: data 
        }); 

        promise_chain = $http({method: 'GET', url: resources[i]}); 
        if (i === l){ 
         return callback(jquerySources); 
        } 
       }); 
      } 
     } 
    } 
}); 

धन्यवाद।

+0

के आधार पर पर

var chain = resources.reduce(function (sourcesPromise, url) { return sourcesPromise.then(function (sources) { return $http({method: 'GET', url: url}) .then(function (data) { sources.push({url: url, source: data}); return sources; }); }); }, $q.when([])); chain.then(function (sources) { // [{url, source}, ...] }); 

आधारित आप वास्तव में बदले में प्रत्येक संसाधन लोड करने के लिए की जरूरत है? यदि नहीं, तो क्या आप केवल कई अनुरोधों को बंद नहीं कर सकते हैं और फिर सभी वादों को हल करने की प्रतीक्षा कर सकते हैं? – codemonkey

+0

क्या आपको अनुक्रमिक रूप से निष्पादित करने की आवश्यकता है या वे समानांतर में चल सकते हैं? –

उत्तर

6

यदि आपको अनुक्रमिक रूप से अनुरोध करने की आवश्यकता होगी, तो आप एक वादा तैयार करेंगे जिसका उपयोग आप अपनी श्रृंखला के प्रमुख के रूप में कर सकते हैं। उसके बाद, आप कर सकते थे श्रृंखला $ http अप कि सिर करने के लिए कॉल और सिर वादा हल:

aService.factory('seq', function($http, $q){ 
    // Dummy resources. 
    var resources = [ 
     'http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js', 
     'http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js', 
     'http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js' 
    ]; 
    var deferred = $q.defer(); 
    var resourcePromise = deferred.promise; 
    var res = []; 
    angular.forEach(resources, function(resource){ 
     return resourcePromise.then(function(){ 
     return $http({ method: 'GET', url: resource }); 
     }).then(function(data){ 
     res.push({res: resource, data : data}); 
     }); 
    }); 

    deferred.resolve(); 

    return { 
     getResource: resourcePromise.then(function(){ 
      return res; 
     }) 
    }; 
}); 

लेकिन अगर अनुरोध समानांतर में होगा - तो यह सरल समाधान होगा। केवल वादों की सरणी और सभी वादों को हल करने के लिए बस $ q.all फ़ंक्शन को कॉल करें।

aService.factory('par', function($http, $q){ 
    // Dummy resources. 
    var resources = [ 
     'http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js', 
     'http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js', 
     'http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js' 
    ]; 
    var promises = []; 
    var res = []; 
    angular.forEach(resources, function(resource){ 
     promises.push(
     $http({ method: 'GET', url: resource }).then(
      function(data){ 
      res.push({res: resource, data : data}); 
      }) 
     ); 
    }); 

    return { 
     getResource: $q.all(promises).then(function(){ 
      return res; 
     }) 
    }; 
}); 

यह भी ध्यान रखें दोनों ही मामलों में हम अनुरोध के परिणाम इकट्ठा करने के लिए रेस सरणी है।

संपादित करें: Plunker with example

+0

मैं बस कुछ इसी तरह की खोज कर रहा था, और यह भयानक ओलेक्सि है। एक किसान सवाल का थोड़ा सा, लेकिन मैं उस डेटा को नियंत्रक में लाने और परेशानी होने का प्रयास कर रहा था। मैं कारखाने में $ http समारोह में डेटा बाहर console.log सकता है, लेकिन एक नियंत्रक में एक गुंजाइश वर में json में उत्पादन प्राप्त करने में सक्षम नहीं। क्या आपके पास इस बारे में कोई सुझाव है कि यह कैसे करें? –

+0

हाँ, bassically आप एक सेवा को फोन करने के बाद() फ़ंक्शन तो फिर प्रयोग करना होगा। मैंने अभी अपने उत्तर में उदाहरण के साथ प्लंकर जोड़ा है, इस पर एक नज़र डालें। –

+0

शानदार, बहुत बहुत धन्यवाद ओलेक्सी, मैं सच में इसकी सराहना। मैंने अभी भी आपका जवाब ऊपर उठाया है। सहायता के लिए धन्यवाद। –

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