AngularJS: capturez tout le statut de réponse 500

Cela peut sembler une demande étrange. Je me demandais s'il y avait une façon d'utiliser un intercepteur $ http pour capturer la première URL qui a un état de réponse de 500, puis arrêter toutes les requêtes et processus ultérieurs et faire quelque chose?

La réponse de Thomas est correcte, mais cette solution est actuellement obsolète . Vous devriez faire quelque chose comme cette réponse .

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'); }); 

Vous pouvez saisir toutes les réponses via $httpProvider.responseInterceptors .

Pour ce faire, vous devez créer une usine comme celle-ci:

 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); }); }; }); 

Dans cette usine, vous obtiendrez l'état de la réponse si 500 font ce que vous voulez. Ensuite, refusez la réponse.

Maintenant, vous devez mettre l'usine dans la $httProvider de $httProvider dans votre module de configuration comme ça:

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

Vous pourriez créer un service et un intercepteur pour faire face à cela,

 .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; }) 

Si vous vouliez autoriser les demandes à refaire, il vous suffit d'appeler ServerErrorService.clear()

OU

Vous pouvez utiliser une version modifiée de cette réponse. Même si je ne suis pas sûr de savoir comment, si vous le vouliez, vous annuliez cette action et autorisiez les demandes ultérieures.

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; }) 

Une chose à retenir pour ces deux solutions, si vous avez d'autres intercepteurs après cela qui ont une méthode responseError définie ou que tous les gestionnaires configurés avec .catch pour traiter la promesse $ http, ils recevront un objet de réponse avec {data:null, status:0}