Angularjs 推送http侦听器时的循环依赖关系

Angularjs 推送http侦听器时的循环依赖关系,angularjs,angular-http-interceptors,Angularjs,Angular Http Interceptors,我正在使用http拦截器拦截应用程序中的每个http请求。 但我发现了循环依赖:$http您确实需要添加use$injector来获取拦截器内部的moservicefactory实例。但这并不是你需要做的全部。您还需要确保不会陷入无限请求循环,因为拦截器也会发出请求。您可以做的是检查当前请求是否是用于令牌刷新的请求,如果是,请不要再发出一个请求,我正在检查此URL 还有一件重要的事要提。您需要从解析为原始请求的拦截器返回promise对象config。通过这种方式,它可以保证在检索令牌后,将重新

我正在使用http拦截器拦截应用程序中的每个http请求。
但我发现了循环依赖:$http您确实需要添加use
$injector
来获取拦截器内部的
moservicefactory
实例。但这并不是你需要做的全部。您还需要确保不会陷入无限请求循环,因为拦截器也会发出请求。您可以做的是检查当前请求是否是用于令牌刷新的请求,如果是,请不要再发出一个请求,我正在检查此URL

还有一件重要的事要提。您需要从解析为原始请求的拦截器返回promise对象
config
。通过这种方式,它可以保证在检索令牌后,将重新发出被截获的请求

所有这些看起来都是这样的:

mPosServices.service('APIInterceptor', ['$injector', '$cookies', function($injector, $cookies) {
    var service = this;
    service.request = function(config) {
        if (!$cookies.get('access_token') && config.url.indexOf('myservice/oauth/token?grant_type=') === -1) {
            return $injector.get('mosServiceFactory').refresh_token().then(function(response) {
                var date = new Date();
                date.setTime(date.getTime() + (response.data.expiresIn * 1000));
                $cookies.remove('access_token');
                $cookies.put('access_token', response.data.value, {
                    expires: date
                });
                $cookies.put('refresh_token', response.data.refreshToken.value);
            }).then(function() {
                return config; // <-- token is refreshed, reissue original request
            });
        }
        return config;
    };

    service.responseError = function(response) {
        return response;
    };
}]);
mPosServices.service('apinterceptor',['$injector','$cookies',函数($injector,$cookies){
var服务=这个;
service.request=函数(配置){
if(!$cookies.get('access_token')&&config.url.indexOf('myservice/oauth/token?grant_type='))=-1){
返回$injector.get('moserviceFactory')。刷新令牌()。然后(函数(响应){
变量日期=新日期();
date.setTime(date.getTime()+(response.data.expiresIn*1000));
$cookies.remove('access_token');
$cookies.put('access_token',response.data.value{
有效期:日期
});
$cookies.put('refresh\u token',response.data.refreshttoken.value);
}).然后(函数(){

return config;//为演示竖起大拇指。太好了answer@dfsq有没有办法绕过iterceptor中的路由请求?您可以检查请求中是否存在
grant\u type
GET参数。但您仍然需要检查当前请求是否用于令牌刷新,以便您不再发出一个请求。我是否遗漏了什么,或者这是真的scond
then(function()
不起作用,因为在第一个
then
块中没有返回承诺?我发现
$injector.get('$http')
服务中调用了
。responseError
函数定义避免了循环依赖性错误。
$httpProvider.interceptors.push('APIInterceptor');
mPosServices.service('APIInterceptor', ['$injector', '$cookies', function($injector, $cookies) {
    var service = this;
    service.request = function(config) {
        if (!$cookies.get('access_token') && config.url.indexOf('myservice/oauth/token?grant_type=') === -1) {
            return $injector.get('mosServiceFactory').refresh_token().then(function(response) {
                var date = new Date();
                date.setTime(date.getTime() + (response.data.expiresIn * 1000));
                $cookies.remove('access_token');
                $cookies.put('access_token', response.data.value, {
                    expires: date
                });
                $cookies.put('refresh_token', response.data.refreshToken.value);
            }).then(function() {
                return config; // <-- token is refreshed, reissue original request
            });
        }
        return config;
    };

    service.responseError = function(response) {
        return response;
    };
}]);