AngularJS:将服务注入HTTP拦截器(循环依赖)

我正在尝试为AngularJS应用编写HTTP拦截器以处理身份验证。

这段代码有效,但是我担心手动注入服务,因为我认为Angular应该自动处理此问题:

    app.config(['$httpProvider', function ($httpProvider) {

$httpProvider.interceptors.push(function ($location, $injector) {

return {

'request': function (config) {

//injected manually to get around circular dependency problem.

var AuthService = $injector.get('AuthService');

console.log(AuthService);

console.log('in request interceptor');

if (!AuthService.isAuthenticated() && $location.path != '/login') {

console.log('user is not logged in.');

$location.path('/login');

}

return config;

}

};

})

}]);

我刚开始做的事情,但是遇到了循环依赖问题:

    app.config(function ($provide, $httpProvider) {

$provide.factory('HttpInterceptor', function ($q, $location, AuthService) {

return {

'request': function (config) {

console.log('in request interceptor.');

if (!AuthService.isAuthenticated() && $location.path != '/login') {

console.log('user is not logged in.');

$location.path('/login');

}

return config;

}

};

});

$httpProvider.interceptors.push('HttpInterceptor');

});

我担心的另一个原因是Angular Docs中$

http上的部分似乎显示了一种将依赖项注入“常规方式”到Http拦截器中的方法。请参阅“拦截器”下的代码段:

// register the interceptor as a service

$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {

return {

// optional method

'request': function(config) {

// do something on success

return config || $q.when(config);

},

// optional method

'requestError': function(rejection) {

// do something on error

if (canRecover(rejection)) {

return responseOrNewPromise

}

return $q.reject(rejection);

},

// optional method

'response': function(response) {

// do something on success

return response || $q.when(response);

},

// optional method

'responseError': function(rejection) {

// do something on error

if (canRecover(rejection)) {

return responseOrNewPromise

}

return $q.reject(rejection);

};

}

});

$httpProvider.interceptors.push('myHttpInterceptor');

上面的代码应该放在哪里?

我想我的问题是执行此操作的正确方法是什么?

谢谢,我希望我的问题很清楚。

回答:

您在$ http和AuthService之间具有循环依赖关系。

您通过使用该$injector服务所做的事情是通过延迟AuthService上$ http的依赖关系来解决“鸡与蛋”问题。

我相信您所做的实际上是最简单的方法。

您还可以通过以下方式执行此操作:

  • 稍后注册拦截器(在一个run()块而不是一个config()块中这样做可能已经成功了)。但是可以保证$ http还没有被调用吗?
  • 通过调用AuthService.setHttp()或其他方式注册拦截器时,将$ http手动“注入”到AuthService中。

以上是 AngularJS:将服务注入HTTP拦截器(循环依赖) 的全部内容, 来源链接: utcz.com/qa/400120.html

回到顶部