Comment puis-je arrêter une demande dans l'intercepteur Angularjs.
Y'a-t'il un quelconque moyen d'y arriver?
J'ai essayé d'utiliser des promesses et d'envoyer rejeter au lieu de résoudre!
.factory('connectionInterceptor', ['$q', '$timeout',
function($q, $timeout) {
var connectionInterceptor = {
request: function(config) {
var q = $q.defer();
$timeout(function() {
q.reject();
}, 2000)
return q.promise;
// return config;
}
}
return connectionInterceptor;
}
])
.config(function($httpProvider) {
$httpProvider.interceptors.Push('connectionInterceptor');
});
Le service $ http a une option timeout pour faire le travail. Vous pouvez faire comme:
angular.module('myApp')
.factory('httpInterceptor', ['$q', '$location',function ($q, $location) {
var canceller = $q.defer();
return {
'request': function(config) {
// promise that should abort the request when resolved.
config.timeout = canceller.promise;
return config;
},
'response': function(response) {
return response;
},
'responseError': function(rejection) {
if (rejection.status === 401) {
canceller.resolve('Unauthorized');
$location.url('/user/signin');
}
if (rejection.status === 403) {
canceller.resolve('Forbidden');
$location.url('/');
}
return $q.reject(rejection);
}
};
}
])
//Http Intercpetor to check auth failures for xhr requests
.config(['$httpProvider',function($httpProvider) {
$httpProvider.interceptors.Push('httpInterceptor');
}]);
J'ai fini par contourner l'appel XHR angulaire avec l'intercepteur angulaire suivant:
function HttpSessionExpiredInterceptor(sessionService) {
return {
request: function(config) {
if (sessionService.hasExpired()) {
/* Avoid any other XHR call. Trick angular into thinking it's a GET request.
* This way the caching mechanism can kick in and bypass the XHR call.
* We return an empty response because, at this point, we do not care about the
* behaviour of the app. */
if (_.startsWith(config.url, '/your-app-base-path/')) {
config.method = 'GET';
config.cache = {
get: function() {
return null;
}
};
}
}
return config;
}
};
}
De cette façon, toute requête, POST, PUT, ... est transformée en GET afin que le mécanisme de mise en cache puisse être utilisé par Par angular. À ce stade, vous pouvez utiliser votre propre mécanisme de mise en cache. Dans mon cas, lorsque la session Arrive à expiration, je ne me soucie plus de ce qu'il faut retourner.
Pas sûr que ce soit possible en général. Mais vous pouvez lancer une requête $ http avec un "annuleur".
Voici un exemple de cette réponse :
var canceler = $q.defer();
$http.get('/someUrl', {timeout: canceler.promise}).success(successCallback);
// later...
canceler.resolve(); // Aborts the $http request if it isn't finished.
Donc, si vous avez le contrôle sur la façon dont vous commencez votre demande, cela pourrait être une option.
Je viens juste de revenir comme objet vide
'request': function request(config) {
if(shouldCancelThisRequest){
return {};
}
return config;
}