描述这一点并不容易,但基本上我有一个设置为提供者的服务,因此我可以对其进行配置。它有一组在我的项目中使用的 API,最初是空的。各种配置块可以将 API 对象添加到数组中,这似乎有效。我每次都 console.log 输出并且数组正在增长。
然后我将我的服务注入其他东西(在本例中为 $http 拦截器函数)并使用服务方法返回数组,但每次我得到一个空数组。
我认为它的工作方式是所有配置块首先运行,并且被拦截的 $http 调用在此之后发生,因此在被拦截时数组应该充满了 API。
无论如何,这是一些代码
angular.module('authModule').provider('authService', function(){
var _apis = [];
return({
addApi: addApi,
$get: instantiateAuth
});
function addApi(newApi){
_apis.push(newApi);
console.log("API added", _apis);
}
function instantiateAuth() {
return({
getApis: function(){
console.log("Getting APIs", _apis);
return _apis;
}
});
}
})
.config(function($httpProvider){
$httpProvider.interceptors.push(function($log, $rootScope, $q) {
return {
request: function(config) {
var injector = angular.injector(['ng', 'authModule']);
var authService = injector.get('authService');
console.log("apis", authService.getApis());
}
};
});
});
还有一个示例配置块
angular.module('myModule').config(function ($provide, authServiceProvider) {
authServiceProvider.addApi({
url: 'https://apiurl.com',
other: 'stuff'
});
authServiceProvider.addApi({
url: 'https://apiurl2.com',
other: 'stuff'
});
});
因此,每次在配置块中调用 appApi 方法(此处两次),此行都会输出数组 console.log("API added", _apis); 并在第一次调用后正确输出一项,在第二次调用后正确输出两项。
当此代码 - authService.getApis() - 在第一次拦截 HTTP 调用时触发时,它会将一个空数组记录到控制台。
任何帮助将不胜感激。
编辑:
问题似乎是这条线
var injector = angular.injector(['ng', 'authModule']);
每次发生这种情况时,我的提供程序似乎都会被重置/重新创建,所以也许我误解了如何使用注入器。我最初只是在函数参数中以正常方式注入我的 authService 但我得到了一个循环依赖(我的身份验证服务需要打开一个模态窗口,但是 angular-ui 模态依赖于 http 服务并且我的 http 调用被拦截到使用我的身份验证服务检查用户是否已通过身份验证:()