Запретить возврат ответа на вызов $ http get до тех пор, пока не поступят все данные

#angularjs

#angularjs

Вопрос:

Я использую get-вызов «$ http» на заводе и хочу прекратить возвращать ответ контроллеру, пока все данные не поступят из серверной части.(Поскольку это асинхронный вызов, перед получением всех данных выполняются коды рядом с вызовом.)Я хочу, чтобы ответ был возвращен, когда поступят все данные, а затем будут выполнены следующие коды. Как я могу это сделать?

Мой контроллер:

 (
    function(){
        angular.module("module").controller("controller", ["$scope",   "FactoryName", function ($scope, FactoryName) {

        var getPrograms = function () {
            FactoryName.functionName()
               .then(
                      function (d) {                              
                              $scope.data = d.Data;                              
                      },
                       function (errResponse) {

                       }
               );
        }
      }])

  }()

)
  

Вот моя фабрика:

 angular.module("module").factory("FactoryName", ["$http", '$q', function   ($http, $q)   {
    return {
        functionName: function () {
            return $http.get("url")
                    .then(
                            function (response) {
                                return response.data;
                            },
                            function (errResponse) {
                                return $q.reject(errResponse);
                            }
                    );
            },
      };
}])
  

Комментарии:

1. Поместите свой код после $scope.data = d.Data

2. Я пробовал это, это не работает….

Ответ №1:

Замените свой заводской код на этот

 angular.module("module").factory("FactoryName", ["$http", '$q', function($http, $q)   {
    return {
        functionName: function () {
            return $http.get("url");
            },
      };
}])
  

И ваш контроллер будет таким

 (
    function(){
        angular.module("module").controller("controller", ["$scope",   "FactoryName", function ($scope, FactoryName) {

        var getPrograms = function () {
            FactoryName.functionName()
               .then(
                      function (response) {             
                          //request loaded
                          $scope.data = response.data; 
                          //Add code here..                             
                      },
                       function (errResponse) {
                          //handle errors
                       }
               );
        }
      }])

  }()

)
  

Ответ №2:

Давайте перепишем фабрику немного по-другому —

 angular.module("module").factory("FactoryName", ["$http", '$q', function   ($http, $q)   {
    return {
        functionName: function () {

           var defer = $q.defer();
           $http.get(URL)
           .success(function(res){
                defer.resolve(res);
           })
           .error(function(error, status){
               defer.reject(error)
           });
        return defer.promise;,
      };
}])
  

Ответ №3:

Используйте этот способ на заводе.

 functionName: function () {
       var deferred = $q.defer();
       return $http.get("url")
       .then(function (response) {
             deferred.resolve(response.data);
        }, function (errResponse) {
             deferred.reject(errResponse);
        }
    );
   return deferred.promise;
  },
};