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

Is it possible to check condition before all http calls in Angular?

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

在调用所有 $http 个调用之前,还是我应该检查每个单独的调用?我的一些电话是通过 angular factory 拨打的,有些则不是。

我认为可能有一些方法,比如 httpInterceptor,它会在某些调用之前进行检查 运行。

如有任何帮助,我们将不胜感激。

您可以为这个问题创建一个 interceptor,如下所示:

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

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

进一步@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');
}

这里分离的比较多。您可以看到如何轻松地将更多拦截器推送到管道中。显然,您可以像 $rootScope 一样将您喜欢的任何东西注入 httpInterceptorService

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

我喜欢@pankajparkar 评论的内容,维护适当的调用堆栈。

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

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