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

Angularjs 是否可以在所有http调用之前检查条件?,angularjs,angular-http,Angularjs,Angular Http,是否可以检查:$rootScope.variable是否为TRUE 在调用所有$http调用之前,还是我应该检查每个调用?我的一些调用是通过angular工厂调用的,而有些则不是 我想也许有一种类似于httpInterceptor的方法,可以在运行某个调用之前进行检查 任何帮助都将不胜感激。您可以为此问题创建一个类似于以下内容的解决方案: angular.module('myModule', []).config(function($httpProvider) { $httpProvi

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

在调用所有
$http
调用之前,还是我应该检查每个调用?我的一些调用是通过angular
工厂调用的,而有些则不是

我想也许有一种类似于httpInterceptor的方法,可以在运行某个调用之前进行检查

任何帮助都将不胜感激。

您可以为此问题创建一个类似于以下内容的解决方案:

angular.module('myModule', []).config(function($httpProvider) { 
    $httpProvider.interceptors.push(function($rootScope) {
        return {
            'request': function(config) {
                if($rootScope.yourVariable) {
                    // cancel this request
                }
            }
        }
    });
})
这个拦截器处理每个请求。您可以找到一个用于取消请求的实现

您可以为此问题创建一个类似以下的解决方案:

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

这个拦截器处理每个请求。您可以找到一个用于取消请求的实现

,以进一步了解@boindil的答案。我倾向于这样:

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评论的内容,维护一个适当的调用堆栈

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


进一步说明@Boindil的答案。我倾向于这样:

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评论的内容,维护一个适当的调用堆栈

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


您应该使用promise chain使用
.then()
来维护适当的调用堆栈,通过一个接一个地调用“我的一些调用是通过angular factory调用的,而另一些不是。”那么,为什么不创建一个执行此检查的工厂,然后始终使用它呢?这将清楚地传达正在发生的事情,而不是在httpInterceptor中发生意外。我认为可能有类似httpInterceptor的方式:好主意。你为什么不阅读他们的文档并尝试一些东西呢?你应该使用promise chain using
.then()
来维护正确的调用堆栈,方法是一个接一个地调用“我的一些调用是通过angular factory调用的,而另一些则不是。”那么,为什么不创建一个进行此检查的工厂,然后一直使用它呢?这将清楚地传达正在发生的事情,而不是在httpInterceptor中发生意外。我认为可能有类似httpInterceptor的方式:好主意。为什么不阅读他们的文档并尝试一下呢?是的,这绝对是一个更干净的实现,我不会直接在生产中使用我的代码。然而,我只是想把
firstChild
引向正确的方向,并给出了文档链接,在那里人们可以找到一个更干净的实现。@boindil是的,这很公平:)@pankajparkar是我回答的第二部分,你在想什么?在我们的生产应用程序中,我们有一个Api服务包装所有$http调用,它与身份验证服务中的拦截器进行检查,以查看本地$cookieStore中是否有身份验证令牌,如果有,则在进行调用之前将其注入头中。$http调用上的服务包装器非常有用。@DanielNalbach您不只是让拦截器来做这件事吗?或者你是说你用自己的服务层来包装http服务,但也有一个拦截器,这绝对是一个更干净的实现,我不会直接在生产中使用我的代码。然而,我只是想把
firstChild
引向正确的方向,并给出了文档链接,在那里人们可以找到一个更干净的实现。@boindil是的,这很公平:)@pankajparkar是我回答的第二部分,你在想什么?在我们的生产应用程序中,我们有一个Api服务包装所有$http调用,它与身份验证服务中的拦截器进行检查,以查看本地$cookieStore中是否有身份验证令牌,如果有,则在进行调用之前将其注入头中。$http调用上的服务包装器非常有用。@DanielNalbach您不只是让拦截器来做这件事吗?或者,您是说您使用自己的服务层包装http服务,但也有一个拦截器