AngularJS – 等待多个资源查询完成
我有一个使用ngResource定义的工厂:
App.factory('Account', function($resource) { return $resource('url', {}, { query: { method: 'GET' } }); });
我正在对该工厂定义的查询方法进行多个调用。 通话可以asynchronous发生,但是我需要等待两个通话才能继续:
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 }; });
有没有办法做到这一点与ngResource定义的AngularJS工厂,类似于jQuery的$ .when()。然后()function? 我不想添加jQuery到我目前的项目。
你会想使用promise和$ q.all() 。
基本上,你可以用它来包装所有的$ resource或$ http调用,因为它们返回promise。
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... });
我认为一个更好的解决scheme是:
$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... });
Ben Lesh的解决scheme是最好的,但并不完整。 如果您需要处理错误条件 – 是的,那么您必须使用承诺API的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
并且你所有的promise都失败了,那么then
方法将不会执行,因此可能会使你的界面处于不良状态。