2013-04-29 3 views
33

में कॉल करता है मैं एक श्रृंखला में एकाधिक अजाक्स कॉल करना चाहता हूं। लेकिन मैं अगली कॉल करने से पहले प्रत्येक कॉल के बाद भी डेटा मालिश करना चाहता हूं। अंत में, जब सभी कॉल सफल हैं, तो मैं कुछ अन्य कोड चलाने के लिए चाहता हूं।चेनिंग अजाक्स AngularJs

मैं अपने अजाक्स कॉल के लिए कोणीय $ http सेवा का उपयोग कर रहा हूं और उस पर चिपकना चाहता हूं।

क्या यह संभव है?

उत्तर

51

हां, यह AngularJS द्वारा बहुत सुंदर ढंग से संभाला जाता है क्योंकि इसकी $http सेवा PromiseAPI के आसपास बनाई गई है। असल में, $http विधियों को कॉल करने का वादा वापस आता है और आप then विधि का उपयोग कर श्रृंखला आसानी से वादे कर सकते हैं। यहाँ एक उदाहरण है:

$http.get('http://host.com/first') 
    .then(function(result){ 
    //post-process results and return 
    return myPostProcess1(result.data); 
    }) 
    .then(function(resultOfPostProcessing){ 
    return $http.get('http://host.com/second'); 
    }) 
    .then(function(result){ 
    //post-process results of the second call and return 
    return myPostProcess2(result.data); 
    }) 
    .then(function(result){ 
     //do something where the last call finished 
    }); 

तुम भी रूप में अच्छी तरह पोस्ट-प्रोसेसिंग और अगले $http समारोह जोड़ सकता है, यह सब जो परिणाम में रुचि रखता है पर निर्भर करता है।

$http.get('http://host.com/first') 
    .then(function(result){ 
    //post-process results and return promise from the next call 
    myPostProcess1(result.data); 
    return $http.get('http://host.com/second'); 
    }) 
    .then(function(secondCallResult){ 
    //do something where the second (and the last) call finished 
    }); 
+3

धन्यवाद Pawel, मैं इसे देख लूंगा। अभी, मैंने '$ q.all' का उपयोग किया और ऐसा लगता है कि मैं क्या चाहता हूं। लेकिन मैं भी इसे आजमाउंगा। – Ketan

+11

@ केतन 'q.all' और यहां वर्णित समाधान 2 अलग-अलग चीजें हैं। 'q.all' बहुत अच्छा है लेकिन केवल समानांतर अनुरोधों के लिए काम करता है, यानी, यदि आप उनके आदेश की परवाह नहीं करते हैं और एक अनुरोध दूसरे के परिणामों पर निर्भर नहीं करता है। आपके प्रश्न से मैं समझ गया हूं कि आप अनुरोधों को चेन करने के बाद हैं, जहां एक अनुरोध को पूरा करने की आवश्यकता है, आप परिणामों का निरीक्षण/प्रक्रिया करना चाहते हैं और फिर केवल एक और अनुरोध जारी करना चाहते हैं। –

+0

मेरी विशेष समस्या में बदल जाता है, उन्हें समानांतर में चलाने के लिए ठीक था, लेकिन वास्तव में जो कुछ मैं चाहता था वह कुछ कोड चलाने के लिए था जब उन सभी को किया गया था। हालांकि आपका उत्तर अभी भी मूल्यवान है क्योंकि मुझे यकीन है कि मैं इसे बाद में जल्द से जल्द चलाऊंगा। मैं आपका जवाब स्वीकार करूंगा। – Ketan

8

स्वीकार्य उत्तर अच्छा है, लेकिन यह पकड़ और आखिरकार विधियों की व्याख्या नहीं करता है जो वास्तव में केक पर टुकड़े टुकड़े करते हैं। यह great article on promises मुझे सीधे सेट करें। यहां उस आलेख के आधार पर कुछ नमूना कोड दिए गए हैं:

$scope.spinner.start(); 

$http.get('/whatever/123456') 
    .then(function(response) { 
    $scope.object1 = response.data; 
    return $http.get('/something_else/?' + $scope.object1.property1); 
    }) 
    .then(function(response) { 
    $scope.object2 = response.data; 
    if ($scope.object2.property88 == "a bad value") 
     throw "Oh no! Something failed!"; 
    return $http.get('/a_third_thing/654321'); 
    }) 
    .then(function(response) { 
    $scope.object3 = response.data; 
    }) 
    .catch(function(error) { 
    // this catches errors from the $http calls as well as from the explicit throw 
    console.log("An error occured: " + error); 
    }) 
    .finally(function() { 
    $scope.spinner.stop(); 
    }); 
संबंधित मुद्दे