2013-03-08 10 views
98

पूर्ण होने की प्रतीक्षा मैं एक एकल ngResource के साथ परिभाषित कारखाना है:AngularJS - कई संसाधन प्रश्नों

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 
    }; 
}); 

वहाँ AngularJS कारखानों ngResource, jQuery के $ .जब (के समान के साथ परिभाषित के साथ ऐसा करने का कोई तरीका है) तो।() कार्यक्षमता? मैं अपने वर्तमान प्रोजेक्ट में jQuery को नहीं जोड़ना पसंद करूंगा।

उत्तर

188

आप वादे और $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... 
}); 
+16

संसाधन वादे वापस नहीं करते हैं, वे भविष्य में भरने के लिए वस्तुओं को वापस कर देते हैं। हालांकि * अस्थिर * 1.1.3 संस्करण में, संसाधनों में '$ फिर संपत्ति भी होती है लेकिन किसी भी वादे ऑब्जेक्ट का पर्दाफाश नहीं करती है। '$ वादा 'का खुलासा 1.1.4 –

+0

@ UmurKontacı में होगा दुर्भाग्यवश * नहीं * कोणीय 1.1.4 में! – nh2

+0

* संसाधनों के बारे में विवरण वादा समस्या नहीं है * [इस धागे] में पाया जा सकता है (https://groups.google.com/forum/#!msg/angular/N5yBJvl7Pbg/C48oelQu6DgJ) और [इस पुल अनुरोध] में (https://github.com/angular/angular.js/pull/2060#issuecomment-17026079)। – nh2

16

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

$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 ({type: 'बिलिंग'}), खाता.क्वायरी ({type: 'शिपिंग'}) – georgeos

10

बेन Lesh से समाधान सबसे अच्छा है, लेकिन इसे पूरा नहीं हुआ है।

$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 को परिभाषित नहीं है और अपने वादे के सभी: आप त्रुटि की स्थिति को संभालने के लिए की जरूरत है - - और हाँ, आप ऐसा करेंगे तो आप catch विधि इस तरह वादा एपीआई पर उपयोग करना चाहिए असफल, फिर then विधि कभी निष्पादित नहीं होगी और इस प्रकार संभवतः आपके इंटरफ़ेस को खराब स्थिति में छोड़ देगा।

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