Есть ли способ, которым я могу дать предупреждение об ошибке, когда мои HTTP-вызовы терпят неудачу из-за доступа в Интернет?

Мой код делает много запросов AngularJS $http. Часто это 3-4 одновременно.

Есть ли способ, которым я могу перехватить http-сообщения, чтобы я получал только одно всплывающее предупреждение, если подключение к Интернету потеряно и выполняется несколько запросов? Я видел другие сайты, которые делают это, но тогда, если для действия требуется несколько вызовов http, кажется, что я могу получить более одного всплывающего окна с ошибкой.

Если возможно, я хотел бы сделать это только в одном месте в моем коде.


person Alan2    schedule 07.02.2015    source источник
comment
какой у вас код, выполняющий http-запрос?   -  person floribon    schedule 07.02.2015
comment
Angular $http выполняет запросы   -  person Alan2    schedule 07.02.2015


Ответы (2)


Вам нужно добавить responseInterceptors внутрь себя $httpProvider на этапе настройки angular. Этот перехватчик вызывается после обработки ответа angular $httpProvider.

КОД

module.config(['$httpProvider', function($httpProvider) {
    var interceptor = ['$rootScope', '$q', '$location', function(scope, $q, $location) {
        function success(response) {
            return response;
        }

        function error(response) {
            var status = response.status;
            if (status == 500) {
                alert("Internal Server Error")
                return;
            }
            if (status == 404) {
                alert("Page not found")
                return;
            }
            // otherwise
            return $q.reject(responseInterceptors);

        }

        return function(promise) {
            return promise.then(success, error);
        }

    }];
    $httpProvider.responseInterceptors.push(interceptor);
}]);

Приведенный выше код предоставит вам лучший контроль над обработкой ошибок, когда какой-либо запрос не выполняется.

Для получения дополнительной информации см. эту ответ.

Обновить

Для отображения предупреждения только после того, как мы могли бы создать службу, если произошла ошибка, которая будет обрабатывать установленную переменную ошибки.

Сервис

module.service('errorService',function(){
   //getter
   this.getErrorFlag = function(){
     return this.isError;
   }
   //setter
   this.setErrorFlag = function(val){
     this.isError = val;
   }
});

Перехватчик

module.config(['$httpProvider', function($httpProvider) {
    var interceptor = ['$rootScope', '$q', '$location','errorService', function(scope, $q, $location,errorService) {
        function success(response) {
            return response;
        }

        function error(response) {
            //setting error variable
            errorService.setErrorFlag(true)
            return $q.reject(responseInterceptors);
        }

        return function(promise) {
            return promise.then(success, error);
        }

    }];
    $httpProvider.responseInterceptors.push(interceptor);
}]);

Внутри вашего контроллера поместите все обещания вызовов $http внутри $q.all, и когда обещания будут разрешены, проверьте флаг isError для errorService. Флаг IsError будет истинным, если ошибка произошла хотя бы один раз, и с его помощью вы можете показать ошибку только один раз.

Контроллер

module.controller('appCtrl',['$scope','$q','errorService',function($scope,$q,errorService){
    var ajax1 = $http.get('url').then(function(){
    },
    function(){
    });
    var ajax2 = $http.get('url').then(function(){
    },
    function(){
    });
    var ajax3 = $http.get('url').then(function(){
    },
    function(){
    });
    errorService.setErrorFlag(false);
    $q.all(ajax1, ajax2, ajax3).then(function(data){
      //check for isError flag from service
      if(errorService.getErrorFlag())
        alert('Error occurred while processing request.'); //this will show only once
      else
        alert('No error occurred while processing request.')
    });
}]);

Надеюсь, это поможет вам. Спасибо.

person Pankaj Parkar    schedule 07.02.2015
comment
Ваше решение выглядит хорошим, но когда мои страницы иногда делают много запросов, я думаю, что это приведет к появлению нескольких окон предупреждений. - person Alan2; 07.02.2015
comment
@Alan Почему вы не перенаправляете пользователя на страницу с ошибкой ... тогда нет проблем с обработкой нескольких ошибок с помощью window.location.hash="/error" - person Pankaj Parkar; 07.02.2015
comment
@ Алан, проверь мой код .. Я обновил ответ. надеюсь, это удовлетворит ваше требование показывать ошибку только один раз. - person Pankaj Parkar; 08.02.2015

Если вы не хотите использовать перехватчик, вы можете просто обработать обратный вызов error ваших вызовов $http:

$scope.httpError = null;

$scope.processHttpError = function() {
  // If you don't already have got an http error
  if (!$scope.httpError) {
    $scope.httpError = "Cannot load stuff";
  }
};

$http.get('/someUrl')
  .success(function(data, status, headers, config) { ... })
  .error($scope.processHttpError);
person floribon    schedule 07.02.2015