Angularjsインターセプターでリクエストを停止するにはどうすればよいですか?.
それを行う方法はありますか?
私はpromiseを使用して、resolveの代わりにrejectを送信してみました!
.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');
});
$ httpサービスには、ジョブを実行するためのオプションtimeoutがあります。あなたは次のようにすることができます:
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');
}]);
angular XHR呼び出しを次のangularインターセプターでバイパスすることになりました:
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;
}
};
}
このようにして、POST、PUT、...などのリクエストはGETとして変換されるため、Angularでキャッシュメカニズムを使用できます。この時点で、独自のキャッシュメカニズムを使用できます。私の場合、セッションの有効期限が切れると、何を返すかは気になりません。
一般的に可能かどうかはわかりません。ただし、「キャンセラー」を使用して$ httpリクエストを開始できます。
これが この答え からの例です:
var canceler = $q.defer();
$http.get('/someUrl', {timeout: canceler.promise}).success(successCallback);
// later...
canceler.resolve(); // Aborts the $http request if it isn't finished.
したがって、リクエストを開始する方法を制御できる場合は、これがオプションになる可能性があります。
空のオブジェクトとして返されることになりました
'request': function request(config) {
if(shouldCancelThisRequest){
return {};
}
return config;
}