我已经定义了服务与功能是这样的:服务如何向控制器返回数据和多个承诺?
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