2016-04-05 4 views
0

У меня есть состояние, которое решает, как:Угловое обещание должно вызывать другие обещания

resolve: { 
       accounts: function(utils) { 
       return utils.getAccounts(); 
       }, 
       data: function(utils) { 
       return utils.getData(); 
       }, 
       termsData: function(utils) { 
       return utils.getTerms(); 
       } 
      } 

мне нужно, чтобы убедиться, что data и termsData вызываются только после того, как accounts возвращаются в угловой resolve.

getAccounts функционировать lõoke как:

function getAccounts() { 
      var deferred = $q.defer(); 
      Restangular.setBaseUrl(baseUrl()); 
      var accountsService = Restangular.all(accountsUrl); 
      accountsService.post({headers}).then(function(data) { 
       deferred.resolve(data); 
      }, function(ex) { 
       deferred.reject(ex); 
      }); 
      return deferred.promise; 
      } 
+1

избежать [отложенные антипаттерн] (http://stackoverflow.com/q/23803743/ 1048572)! – Bergi

+0

@theConstructor помогает любой ответ? –

ответ

2

Вы можете добавить учетные записи в зависимости так же, как я предполагаю, что вы делаете в контроллере:

resolve: { 
      accounts: function(utils) { 
      return utils.getAccounts(); 
      }, 
      data: ['accounts', 'utils', function(accounts, utils) { 
       accounts.then(function(data){ 
       return utils.getData(); 
       }, function(data){ 
       return $q.reject(); 
       }); 
      }] 
     } 
} 
0

Вы могли бы назвать другие два разы getAccounts функции обещание разрешатся, а затем сделать возвращать данные с getData & getTerms обещания с $q.all.

resolve: { 
    accounts: function(utils, $q) { 
     return utils.getAccounts().then(function(accounts){ 
      return $q.all([accounts, utils.getData(), utils.getTerms()]) 
     }); 
    } 
} 

Контроллер

app.controller('mainCtrl', function($q, $scope, accounts){ 
    console.log("accounts", accounts[0]) 
    console.log("getData Response", accounts[1]) 
    console.log("getTerms Response", accounts[2]) 
}) 
-1

Предполагая, что вы должны получить все ваши данные асинхронно вы можете просто перестроить свой код, чтобы воспользоваться рисунком обещания.

var getAccounts = function(...) { 
    return new Promise(resolve, reject) { 
    ... do something and resolve or reject 
    }; 
}; 

var getTermsData = funciton= function(...) { 
    return new Promise(resolve, reject) { 
    ... do something and resolve or reject 
    }; 
}; 

var getData = = function(...) { 
    return new Promise(resolve, reject) { 
    ... do something and resolve or reject 
    }; 
}; 

getAccounts.then(function(accounts) { 
    return getTermData(); 
}.then(function(termData) { 
    return getData(data); 
}.catch(function() { 
    // something went wrong! 
}