2013-10-03 2 views
14

Это может показаться странным запросом. Мне было интересно, есть ли способ использовать перехватчик $ http, чтобы поймать первый URL-адрес, который имеет статус ответа 500, а затем остановить все последующие запросы и процессы и что-то сделать?AngularJS: Получить весь статус ответа 500

ответ

9

Вы можете поймать все ответы через $httpProvider.responseInterceptors.

Для этого нужно создать фабрику, как это:

app.factory('SecurityHttpInterceptor', function($q) { 
     return function (promise) { 
      return promise.then(function (response) { 
       return response; 
      }, 
      function (response) { 
       if (response.status === 500) { 
        //DO WHAT YOU WANT 
       } 
       return $q.reject(response); 
      }); 
     }; 
    }); 

В этой фабрике Вы поймаете статус ответа, если это 500 сделать то, что вы хотите. Затем отклоните ответ.

Теперь вы должны поставить завод в responseInterceptors из $httProvider в модуле конфигурации так:

app.config(function ($routeProvider, $httpProvider) { 
    $routeProvider 
     .when('/', { 
      templateUrl: 'views/home.html', 
      controller: 'HomeCtrl' 
     }) 
     .otherwise({ 
      templateUrl: 'views/404.html' 
     }); 

    $httpProvider.responseInterceptors.push('SecurityHttpInterceptor'); 
}) 
+0

Жаль, что я должен был сказать, я знал, как сделать перехватчик, мне было интересно, если есть способ, на самом деле «стоп» за $ http.pendingRequests очереди в первый раз статус 500 возникновении ошибки. –

+0

Я также ищу решение для остановки всех последующих запросов при обнаружении определенного кода состояния (403 в моем случае). У меня уже есть перехватчик, но не знаю, как продолжить оттуда. Поделитесь, если у вас есть решение этого, спасибо. – Mark

2

Вы можете создать службу и перехватчик для борьбы с этим,

.factory('ServerErrorService', function() { 

     var _hasError = false 

     return { 
      get hasError() { 
       return _hasError; 
      }, 
      set hasError(value) { 
       _hasError = value; 
       // you could broadcast an event on $rootScope to notify another service that it has to deal with the error 
      }, 
      clear: clear 
     } 

     function clear() { 
      _hasError = false; 
     } 
}) 


.factory('ServerErrorInterceptor', function ($q, ServerErrorService) { 

    var interceptor = { 

     request: function(config) { 

      if(ServerErrorService.hasError) { 
       var q = $q.defer(); 
       q.reject('prevented request'); 
       return q.promise; 
      } 
      return config; 
     }, 

     responseError: function(response) { 

      if(response.status === 500) { 
       ServerErrorService.hasError = true; 
      } 

      return $q.reject(response); 
     } 
    } 

    return interceptor; 
}) 

Если вы хотели разрешить повторные запросы, тогда вам просто нужно позвонить ServerErrorService.clear()

OR

Вы можете использовать модифицированную версию этого ответа. Хотя я не уверен, как - если бы вы захотели - вы отмените это действие и разрешите последующие запросы.

https://stackoverflow.com/a/25475121/1798234

.factory('ServerErrorInterceptor', function ($q) { 
    var canceller = $q.defer(); 
    var interceptor = { 

     request: function(config) { 
      config.timeout = canceller.promise; 
      return config; 
     }, 

     responseError: function(response) { 

      if(response.status === 500) { 
       canceller.resolve('server error'); 
      } 

      return $q.reject(response); 
     } 
    } 

    return interceptor; 
}) 

Одна вещь, чтобы помнить оба эти решения, если у вас есть какие-либо другие перехватчики после этого, что есть метод responseError определенный или обработчики, установленные с .catch обрабатывать $ HTTP обещание, они будут получать объект ответа с {data:null, status:0}

10

Thomas answer является правильным, но это решение в настоящее время осуждается. Вы должны сделать что-то вроде этого answer.

app.factory('errorInterceptor', function ($q) { 

    var preventFurtherRequests = false; 

    return { 
     request: function (config) { 

      if (preventFurtherRequests) { 
       return; 
      } 

      return config || $q.when(config); 
     }, 
     requestError: function(request){ 
      return $q.reject(request); 
     }, 
     response: function (response) { 
      return response || $q.when(response); 
     }, 
     responseError: function (response) { 
      if (response && response.status === 401) { 
       // log 
      } 
      if (response && response.status === 500) { 
       preventFurtherRequests = true; 
      } 

      return $q.reject(response); 
     } 
    }; 
}); 

app.config(function ($httpProvider) { 
    $httpProvider.interceptors.push('errorInterceptor');  
}); 
Смежные вопросы