0

在我的控制器中,我有以下调用:

optionService.init($scope);
optionService.getSubjects1($scope);
optionService.getSubjects2($scope);
optionService.getAbc($scope);

这是 optionService 的代码:

angular.module('common')
    .factory('optionService',
    ['$http',function ($http) {
        var factory = {
            init: function ($scope) {
                $scope.option = {};
            },
            getSubjects1: function ($scope) {
                var url = '/api/Subject1/GetSelect';
                $scope.loading++;
                $http.get(url)
                    .success(function (data, status, headers, config) {
                        $scope.option.subjects1 = data;
                        $scope.loading--;
                    })
                    .error(function (data, status, headers, config) {
                        $scope.loading--;
                        alert("Error: No data returned from " + url);
                    });
            },
            getSubjects2: function ($scope) {
                var url = '/api/Subject2/GetSelect';
                $scope.loading++;
                $http.get(url)
                    .success(function (data, status, headers, config) {
                        $scope.option.subjects2 = data;
                        $scope.loading--;
                    })
                    .error(function (data, status, headers, config) {
                        $scope.loading--;
                        alert("Error: No data returned from " + url);
                    });
            },
        }
        return factory;

    }]);

有没有一种方法可以让我调用 optionService.getAbc 取决于 getSubjects1 和 getSubjects2 调用的完成情况?如果这有什么不同的话,我很快也会使用 Angular 1.2。

4

2 回答 2

1

$q.all(promises)让您可以将多个 Promise 合并为一个:

optionService.getAbc = function($scope) {
    $q.all([
       optionService.getSubjects1($scope), 
       optionService.getSubjects2($scope)
     ])
     .then(function() {
       //...
     });
 }

编辑. getSubjects是的,你需要从你的函数中返回 Promise 。要将代码更改保持在最低限度,您可以执行以下操作:

optionService.getSubjects1($scope) {
  var url = '/api/Subject1/GetSelect';
  $scope.loading++;
  return $http.get(url)
    .then(function (data, status, headers, config) {
      $scope.option.subjects1 = data;
      $scope.loading--;
    }, function (data, status, headers, config) {
      $scope.loading--;
      alert("Error: No data returned from " + url);
    });
}

$http.then()您一起创建一个新的承诺,该承诺可以与其他承诺相结合getAbc()

于 2013-11-11T11:28:56.687 回答
0

你应该重写你的getSubject1getSubject2返回承诺。同样将方法传递$scope给方法并从服务方法更新范围也不是一种好的做事方式。您的服务方法应返回可在您的代码中分配的数据。这使您的服务更加可用和可读。

如果你改变getSubject1getSubject2

getSubjects1: function () {
                var url = '/api/Subject1/GetSelect';
                return $http.get(url);
}

在您的控制器中,您可以执行

$q.all([
       optionService.getSubjects1(), 
       optionService.getSubjects2()
     ])
     .then(function([data1, data2]) {
       //use data1 to update scope for subject1
       // use data2 to update scope for subject2
       //call any service method.
 });
于 2013-11-11T11:57:15.577 回答