2013-03-31 8 views
17

मेरे पास एक नियंत्रक है जिसे दो अलग-अलग आरईएसटी संसाधनों को पुनर्प्राप्त करने की आवश्यकता है जो दो ड्रॉपडाउन को पॉप्युलेट करेंगे। मैं उनमें से किसी भी पॉपुलटिंग से बचने के लिए बाध्य करना चाहता हूं जब तक कि दोनों $ http.get() कॉल वापस नहीं आतीं, ताकि ड्रॉपडाउन एक ही समय में एक दूसरे के बाद घूमने के बजाय पॉप्युलेट हो जाएं।

क्या $ http.get() कॉल को बंडल करना संभव है और दोनों परिदृश्यों के लिए राज्य तर्क लिखने के बिना, दोनों लौटाए गए सरणी के लिए $ स्कोप वेरिएबल्स सेट किया गया है, उदा। बी से पहले एक रिटर्न, बी पहले से रिटर्न?

+1

एफवाईआई - प्रश्न शीर्षक "श्रृंखला" कहता है लेकिन शरीर में शामिल होने का वर्णन किया गया है। सुनिश्चित नहीं है कि कोई संपादन यहां उचित है या नहीं। –

उत्तर

36

कोणीय $http फ़ंक्शन को कॉल की वापसी मान है एक Promise वस्तु $q का उपयोग कर (एक वादा/आस्थगित Kris Kowal's Q से प्रेरित कार्यान्वयन) ।

$q.all(promises) विधि दस्तावेज़ पर एक नज़र डालें:

जाता है कि जब इनपुट वादे के सभी हल कर रहे हैं का समाधान एक भी वादा में कई वादों को संयोजित करता है।

पैरामीटर

  • वादे - {Array.<Promise>} - वादों की एक सरणी।

रिटर्न

{Promise} - एक वादा है कि मूल्यों की एक सरणी, प्रत्येक मान वादों सरणी में एक ही सूचकांक में वादा करने के लिए इसी के साथ समाधान हो जाएगा देता है। यदि promises में से कोई भी अस्वीकृति के साथ हल किया गया है, तो परिणामी वादे को उसी अस्वीकृति के साथ हल किया जाएगा।

आप अपने http कॉल के परिणाम "में शामिल होने के लिए" $q.all उपयोग कर सकते हैं, के लिए इसी तरह के कोड के साथ: https://github.com/caolan/async: आप यहाँ Async javsscript पुस्तकालय इस्तेमाल कर सकते हैं

app.controller("AppCtrl", function ($scope, $http, $q) { 

    $q.all([ 
    $http.get('/someUrl1'), 
    $http.get('/someUrl2') 
    ]).then(function(results) { 
    /* your logic here */ 
    }); 
} 
+0

त्रुटि() के साथ क्या होता है? क्या यह परिणामों की सरणी में उपलब्ध होगा? – brushleaf

+0

किसी भी अस्वीकृति पर प्रलेखन नोट देखें, परिणाम अस्वीकार –

+5

यह "चेन" नहीं है लेकिन "बंडल" – percebus

5

आप कुछ इस तरह मतलब है:

function someController($scope, $http, $q) { 
    var first_meth = $http.get("first_url"), 
     second_meth = $http.get("second_url"); 
    $q.all([first_meth, second_meth]).then(function(all_your_results_array) { 
     //here you'll get results for both the calls 
    }); 
} 

रेफरी: Angular JS Doc

0

श्रृंखला कॉल का उपयोग करें। यह 2 कॉल करेगा और फिर दोनों कॉल किए जाने पर एक कॉलबैक कॉल करेगा।

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