服务如何将数据和多个承诺返回给控制器?

时间:2014-03-01 11:45:29

标签: angularjs

我已经定义了一个具有以下功能的服务:

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完成并且所有调用成功后填充$ scope吗?

1 个答案:

答案 0 :(得分:2)

你说控制器真的应该这样做是绝对正确的,删除​​范围的传递会更加清晰(并使其更易于重复使用)。我不知道你确切的用例,阅读有点令人困惑,但是你可以通过挂钩$http创建的承诺来做到这一点,并且仍然可以处理所有的承诺。完成。

小提琴:http://jsfiddle.net/PtM8N/3/

HTML

<div ng-app="myApp" ng-controller="Ctrl">
    {{model | json}}
    <div ng-show="loading">Loading...</div>
</div>

var app = angular.module("myApp", []);

app.service("_service", ["$http", function (http) {
    this.firstRequest = function () {
        return http.get("http://json.ph/json?delay=1000")
        .then(function (res) {
            // manipulate data
            res.data.something = new Date();
            return res.data;
        });
    };
    this.secondRequest = function () {
        return http.get("http://json.ph/json?delay=2000")
        .then(function (res) {
            // manipulate data
            res.data.something = 12345;
            return res.data;
        });
    };
    this.thirdRequest = function () {
        return http.get("http://json.ph/json?delay=3000")
        .then(function (res) {
            // manipulate data
            res.data.something = "bacon";
            return res.data;
        });
    };
}]);

app.controller("Ctrl", ["$scope", "_service", "$q", function (scope, service, q) {

    scope.loading = true;
    scope.model = {};

    var firstRequest = service.firstRequest();
    var secondRequest = service.secondRequest();
    var thirdRequest = service.thirdRequest();

    q.all([firstRequest, secondRequest, thirdRequest]).then(function (responses) {
        scope.model.first = responses[0];
        scope.model.second = responses[1];
        scope.model.third = responses[2];
        scope.loading = false;
    });

}]);