AngularJS - कई संसाधन प्रश्नों के पूरा होने की प्रतीक्षा करें


105

मैं ngResource के साथ परिभाषित एक एकल कारखाना है:

App.factory('Account', function($resource) {
    return $resource('url', {}, {
        query: { method: 'GET' }
    });
});

मैं इस कारखाने में परिभाषित क्वेरी पद्धति के लिए कई कॉल कर रहा हूं। कॉल एसिंक्रोनस रूप से हो सकते हैं, लेकिन मुझे जारी रखने से पहले दोनों कॉल के पूरा होने की प्रतीक्षा करनी होगी:

App.controller('AccountsCtrl', function ($scope, Account) {
    $scope.loadAccounts = function () {
        var billingAccounts = Account.query({ type: 'billing' });
        var shippingAccounts = Account.query({ type: 'shipping' });

        // wait for both calls to complete before returning
    };
});

वहाँ ऐसा करने का एक तरीका है, जो एनजीआरआरजे के साथ परिभाषित किया गया है। मैं अपने वर्तमान प्रोजेक्ट में jQuery नहीं जोड़ना पसंद करूंगा।

जवाबों:


200

आप वादों और $ q.all () का उपयोग करना चाहते हैं ।

मूल रूप से, आप इसका उपयोग अपने सभी $ संसाधन या $ http कॉल को लपेटने के लिए कर सकते हैं क्योंकि वे वादे वापस करते हैं।

function doQuery(type) {
   var d = $q.defer();
   var result = Account.query({ type: type }, function() {
        d.resolve(result);
   });
   return d.promise;
}

$q.all([
   doQuery('billing'),
   doQuery('shipping')
]).then(function(data) {
   var billingAccounts = data[0];
   var shippingAccounts = data[1];

   //TODO: something...
});

17
संसाधन वादे वापस नहीं करते, वे भविष्य में वस्तुओं को वापस करते हैं। हालांकि अस्थिर 1.1.3 संस्करण में, संसाधनों में भी $thenसंपत्ति होती है लेकिन किसी भी वादे की वस्तु को उजागर नहीं करते हैं। उजागर $promiseपूरी तरह से 1.1.4 में होगा
Umur Kontacı

@ UmurKontacı यह दुर्भाग्य से कोणीय 1.1.4 में नहीं है!
nh2

संसाधनों के बारे में विवरण वादे नहीं हैं समस्या इस धागे में और इस पुल अनुरोध में पाई जा सकती है ।
nh2

1
यह उत्तर दिखाता है कि इसे एक बार लागू होने के बाद कैसे लिखना है।
nh2

3
आपका उत्तर बहुत मददगार है और मेरा मानना ​​है कि संसाधनों को वर्तमान कोणीय में वादों में बदलने का सबसे समझदार तरीका है। यह जोड़ने में मददगार हो सकता है कि जिस दस्तावेज़ से $qआप जुड़े थे, वह गारंटी देता है कि परिणाम सरणी वादे सरणी के समान क्रम में है।
nh2

20

मुझे लगता है कि एक बेहतर समाधान है:

$q.all([
   Account.query({ type: 'billing' }).$promise,
   Account.query({ type: 'shipping' }).$promise
]).then(function(data) {
   var billingAccounts = data[0];
   var shippingAccounts = data[1];

   //TODO: something...
});

1
मेरे लिए अंत में $ वादा किए बिना काम किया ... जैसे: Account.query ({प्रकार: 'बिलिंग'}),
Account.query

12

बेन लेश से समाधान सबसे अच्छा है लेकिन यह पूरा नहीं हुआ है। यदि आपको त्रुटि स्थितियों को संभालने की आवश्यकता है - और, हां, आप करते हैं - तो आपको catchइस तरह से वादे एपीआई पर विधि का उपयोग करना होगा :

$q.all([
   doQuery('billing'),
   doQuery('shipping')
]).then(function(data) {
   var billingAccounts = data[0];
   var shippingAccounts = data[1];

   //TODO: something...

}).catch(function(data) {

   //TODO: handle the error conditions...

}).finally(function () {

  //TODO: do final clean up work, etc...

});

यदि आप परिभाषित नहीं करते हैं catchऔर आपके सभी वादे विफल हो जाते हैं, तो thenविधि कभी भी निष्पादित नहीं करेगी और इस प्रकार संभवतः आपके इंटरफ़ेस को खराब स्थिति में छोड़ देगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.