2013-02-27 177 views
14

पूरा करने के बाद कार्रवाई करें, मैं अभी भी अपने मस्तिष्क को कोणीय के आसपास लपेट रहा हूं। जेएस।कोणीय। जेएस दो एसिंक सेवा कॉल से आग लगाना, फिर

मेरे पास दो स्वतंत्र $ http कॉल हैं जो दूरस्थ वेब सेवाओं से डेटा पुनर्प्राप्त करते हैं। मेरे पास एक ऐसी कार्रवाई है जिसे मैं सेवा कॉल पूरा होने के बाद बंद करना चाहता हूं।

  1. पहले सेवा कॉल, $ scope.model
  2. दूसरी सेवा कॉल से स्थापित हो जाएगा $ scope.model में डेटा को संशोधित करता
(यह कुछ काउंटर गुण उस दृश्य में गाया जाता है कहते हैं)

एक और अनूठी आवश्यकता यह है कि अंत में दूसरी सेवा कॉल को $ scope.model के साथ नियंत्रक के बाहर बुलाया और अपडेट किया जाएगा। यह एक अधिसूचना संदेश पंप है।

मुझे लगता है कि मैं $ क्यू और संभवतः $ सेवा का वादा करने जा रहा हूं, लेकिन मुझे सच में यकीन नहीं है कि कुछ सर्वोत्तम प्रथाओं के बाद इस तरह से कुछ कहां से शुरू करना है।

मुझे पता है कि यह एसिंक कॉल की तरह नहीं लगता है, क्योंकि मेरा उदाहरण इसे सिंक्रनाइज़ करके इसे सरल बना सकता है। हालांकि, दूसरी सेवा कॉल एक अधिसूचना अद्यतनकर्ता है, इसलिए इसे लगातार सर्वर पर मतदान किया जाएगा (अंततः एक वेबसाईट का उपयोग किया जाएगा)।

यह एक आम पैटर्न है जिसे मैं इस एप्लिकेशन में देखूंगा।

उत्तर

29

आप $ का उपयोग करना चाहेंगे क्यू वादा करता हूँ। विशेष रूप से $ q.all()। सभी $ http विधियां वादे वापस कर देंगे। $q.all([promise, promise, promise]).then(doSomething) सभी वादे को हल करने के लिए इंतजार करेगा, इसके बाद doSomething पर वादे के परिणामों को पारित करने के लिए कॉल करें।

app.service('myService', ['$http', '$q', function($http, $q) { 
    return { 
     waitForBoth: function() { 
      return $q.all([ 
      $http.get('/One/Thing'), 
      $http.get('/Other/Thing') 
      ]); 
     }; 
    } 
}]); 

तो यह कहते हैं:

app.controller('MyCtrl', ['$scope', 'myService', function($scope, myService) { 
    myService.waitForBoth().then(function (returnValues){ 
     var from1 = returnValues[0].data; 
     var from2 = returnValues[1].data; 
     //do something here. 
    }); 
}]); 

यहाँ आप के लिए एक प्रदर्शन Plunker है।

+0

शुरुआत में उत्तर के इस संस्करण के साथ गया था। भविष्य में, मैं परिवर्तन के लिए संपत्ति देखने के लिए अपना कोड बदल सकता हूं, क्योंकि अंततः यह एक संदेश पंप सुन रहा होगा। और उदाहरण कोड में minifiable सेवा घोषणा वाक्यविन्यास का उपयोग करने के लिए बोनस अंक। – taudep

+0

हाहा ... मुझे कोई बोनस अंक नहीं दिख रहा है! : पी मैंने नियंत्रक घोषणा को बदल दिया है ताकि मिनी-फ्रेंडली सिंटैक्स भी हो सके। मैं खुशी से मदद कर सकता है। –

+0

लिखने के लिए धन्यवाद कि आपको मूल्यों की एक सरणी पारित करने की आवश्यकता है ..... argg मुझे थोड़ी देर के लिए याद आया! –

2

अपनी पहली सेवा कॉल के लिए सेवा बनाएं। , तो() कॉलबैक में https://stackoverflow.com/a/12513509/215945

अपने नियंत्रक में, उचित $ scope.model संपत्ति के लिए एक $ घड़ी जोड़ें:: पीट के जवाब यह है कि साथ में मदद मिलेगी

app.controller('MainCtrl', function(myService, $scope) { 
    myService.async().then(function(myData) { 
    $scope.model = myData; 
    $scope.$watch('model.???', function(newVal, oldVal) { 
     if(newVal !== oldVal) { 
     // do something here, now that $scope.model.??? has changed 
     } 
    }) 
    }); 
}); 
+1

ऐसा लगता है कि यह उस दिन का समय है जहां मैं @MarkRajcok –

+0

के साथ उत्तर व्यापार करता हूं, दोनों समाधानों के साथ बजाना। धन्यवाद! मैं जल्द ही एक को पूरा कर दूंगा। दूसरे कॉल को जरूरी पूरा करने से पहले मैं पहले कॉल में डेटा प्रस्तुत करना चाहता हूं, इसलिए नीचे दिए गए फोरबॉथ विचार पर मॉडल पर $ देखने की संभावना मेरे लिए महत्वपूर्ण है। – taudep