AngularJS - wait for multiple resource queries to complete

前端 未结 3 1543
遥遥无期
遥遥无期 2020-11-29 17:57

I have a single factory defined with ngResource:

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


        
相关标签:
3条回答
  • 2020-11-29 18:04

    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...
    });
    
    0 讨论(0)
  • 2020-11-29 18:15

    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.

    0 讨论(0)
  • 2020-11-29 18:25

    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...
    });
    
    0 讨论(0)
提交回复
热议问题