AngularJS - wait for multiple resource queries to complete
The solution from Ben Lesh is the best but it's not complete. If you need to handle error conditions--and, yes, you do--then you must use the catch
method on the promise API like this:
$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...
});
If you don't define catch
and all of your promises fail, then the then
method won't ever execute and thus will probably leave your interface in a bad state.
You'll want to use promises and $q.all().
Basically, you can use it to wrap all of your $resource or $http calls because they return promises.
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...
});
I think a better solution is:
$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...
});