我已經定義了服務與功能是這樣的:服務如何向控制器返回數據和多個承諾?
angular.module('common').factory('_o', ['$angularCacheFactory', '$http', '$q', '$resource', '$timeout', '_u',
function ($angularCacheFactory, $http, $q, $resource, $timeout, _u) {
var _getContentTypes = function ($scope) {
var defer = $q.defer();
$http.get('/api/ContentType/GetSelect', { cache: _u.oyc })
.success(function (data) {
$scope.option.contentTypes = data;
$scope.option.contentTypesPlus = [{ id: 0, name: '*' }].concat(data);
$scope.option.sContentType = parseInt(_u.oyc.get('sContentType')) || 0;
defer.resolve();
})
return defer.promise;
};
return {
getContentTypes: _getContentTypes
}
}]);
我打電話這在我的控制是這樣的:
.controller('AdminProblemController', ['$http', '$q', '$resource', '$rootScope', '$scope', '_g', '_o', '_u',
function ($http, $q, $resource, $rootScope, $scope, _g, _o, _u) {
$scope.entityType = "Problem";
_u.oyc.put('adminPage', $scope.entityType.toLowerCase());
$q.all([
_o.getContentTypes($scope),
_o.getABC($scope),
_o.getDEF($scope)
])
我是在說正確的,這是不使用的最佳方法服務。我想我應該返回 內容類型數據,然後在控制器中分配給範圍內的服務。
但我不知道如何做到這一點,因爲我的服務只是返回一個defer.promise,我使用$ q.all,所以我認爲我應該在$ q.all已經爲每個調用返回成功之後填充範圍。
有人可以給我一些建議,我應該如何從承諾的服務中返回數據,並讓$ q.all在所有調用成功完成後填充$作用域?
你說的沒錯,這是一個使用服務......做你想要什麼非常糟糕的方式,你應該在每種方法中返回諾言,然後你可以鏈接它們並在最後做一些事情,你只需要計算如何傳遞數據,以便它們都在結尾承諾 – doodeec
btw中可用。 'http.get'已經返回一個promise,所以你不必將它包裝在另一個promise中......並且在本週的javascript週刊中有一篇關於promises的很棒的文章,你會在那裏找到一個'chain'模式 - http://taoofcode.net/promise-anti-patterns/ – doodeec