是否可以在Angular中的所有http调用之前检查条件?

时间:2015-02-25 07:47:44

标签: angularjs angular-http

是否可以检查:$rootScope.variable is TRUE

在调用所有$http来电之前,还是应该检查每个电话?我的一些电话是通过角度factory来调用的,有些则不是。

我认为可能有某种方式像httpInterceptor,它会在某些调用运行之前检查。

任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:3)

您可以为此问题创建interceptor,如下所示:

angular.module('myModule', []).config(function($httpProvider) { 
    $httpProvider.interceptors.push(function($rootScope) {
        return {
            'request': function(config) {
                if($rootScope.yourVariable) {
                    // cancel this request
                }
            }
        }
    });
})

此拦截器处理每个请求。您可以找到取消请求的实现here

答案 1 :(得分:1)

进一步了解@ boindiil的回答。我倾向于这样:

angular.module('someModule', [])
    .factory('httpInterceptorService', ['$q', httpInterceptorService])
    .config(['$httpProvider', interceptorConfig]);

function httpInterceptorService($q) {
    var service = {
        request: request,
        responseError: responseError
    };

    return service;

    function request(config) {
        // do some logic
        return config;
    }

    function responseError(rejection) {
        if (rejection.status === 401) {
             // they were unauthorised.
        }

        return $q.reject(rejection);
    }
}

function interceptorConfig ($httpProvider) {
    $httpProvider.interceptors.push('httpInterceptorService');
}

这里更加分离。您可以看到如何轻松地将更多拦截器推入管道。显然,您可以像httpInterceptorService一样将$rootScope注入到angular.module('someModule', []) .factory('mainService', ['$http', '$rootScope', '$q', mainService]) .controller('MainCtrl', ['mainService', mainCtrl]); function mainService($http, $rootScope, $q) { var service = { getThings: getThings }; var serviceBase = '/Api/Things'; return service; function getThings() { var deferred = $q.defer(); $http.get(serviceBase).then(function (data) { if (data.data.someVariable == $rootScope.someVariable) { deferred.resolve(data.data); } else { deferred.reject(data); } }).catch(function (message) { deferred.reject(message); }); return deferred.promise; } } function mainCtrl(mainService) { var vm = this; vm.httpData = {}; mainService.getThings().then(function (data) { vm.httpData = data; }, function (message) { // do something with the error. }); } 中。

请注意不要创建任何循环依赖项。

我喜欢@pankajparkar评论的内容,维护一个正确的调用堆栈。

您可以这样做而不是使用拦截器(因为它们适用于每个请求)。

{{1}}