web-dev-qa-db-ja.com

anglejsインターセプターでリクエストを停止します

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

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

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でキャッシュメカニズムを使用できます。この時点で、独自のキャッシュメカニズムを使用できます。私の場合、セッションの有効期限が切れると、何を返すかは気になりません。

7
jtheoof

一般的に可能かどうかはわかりません。ただし、「キャンセラー」を使用して$ 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.

したがって、リクエストを開始する方法を制御できる場合は、これがオプションになる可能性があります。

1
Philipp Claßen

空のオブジェクトとして返されることになりました

'request': function request(config) {
    if(shouldCancelThisRequest){  
        return {};
    }
    return config;
}
0
excitepv