Javascript 角度4:无法实例化循环依赖项!InjectionToken_HTTP_拦截器
我知道,这个问题听起来可能是重复的,我已经尝试了stackover flow上的所有方法无法解决这个问题,所以请容忍我 为了使您能够重现错误,我提供了所有代码 问题 我得到以下错误: 提供程序分析错误:↵无法实例化循环依赖项! InjectionToken_HTTP_拦截器(“[ERROR->]”):在NgModule AppModule中 在./AppModule@-1:-1中 有关场景的信息(注意事项) 注1 文件: 路径:Javascript 角度4:无法实例化循环依赖项!InjectionToken_HTTP_拦截器,javascript,angular,circular-dependency,Javascript,Angular,Circular Dependency,我知道,这个问题听起来可能是重复的,我已经尝试了stackover flow上的所有方法无法解决这个问题,所以请容忍我 为了使您能够重现错误,我提供了所有代码 问题 我得到以下错误: 提供程序分析错误:↵无法实例化循环依赖项! InjectionToken_HTTP_拦截器(“[ERROR->]”):在NgModule AppModule中 在./AppModule@-1:-1中 有关场景的信息(注意事项) 注1 文件: 路径:/src/app/shared/interceptors/res
/src/app/shared/interceptors/response interceptor/
我正在拦截HTTPClient
响应,以检查401
错误,当出现错误时,我需要要求用户重新登录
为了向用户显示重新登录提示,我制作了一个具有“重新登录”功能的global functions services
注2
文件:
路径:/src/app/shared/services/helper services/global function/
这就是这一切开始发生的地方。。。
只要我注入PersonService
constructor(
public dialog: MatDialog,
private _personService: PersonService
) { }
我收到此错误,在中找不到任何可能导致此问题的导入
个人服务:/src/app/shared/services/api services/person/person.service.ts
import { IRequest } from './../../../interfaces/I-request';
import { environment } from 'environments/environment';
import { Injectable } from '@angular/core';
// for service
import 'rxjs/add/operator/map'
import 'rxjs/add/operator/toPromise';
// models
import { Person } from 'app/shared/models/person';
import { RequestFactoryService, REQUEST_TYPES } from 'app/shared/factories/request-factory/request-factory.service';
@Injectable()
export class PersonService {
private _requestService: IRequest;
constructor(
_requestFactoryService: RequestFactoryService
) {
this._requestService = _requestFactoryService.getStorage(REQUEST_TYPES.HTTP);
}
public signup(record): Promise<Person> {
let url = environment.api + 'person/public/signup';
return this._requestService.post(url, record) as Promise<Person>;;
}
public authenticate(code: string, password: string): Promise<Person> {
let url = environment.api + 'auth/signin';
let postData = {
code: code,
password: password
}
return this._requestService.post(url, postData) as Promise<Person>;
}
}
从'/../../../../interfaces/I-request'导入{IRequest};
从“environments/environment”导入{environment};
从“@angular/core”导入{Injectable};
//服务
导入“rxjs/add/operator/map”
导入“rxjs/add/operator/toPromise”;
//模型
从“app/shared/models/Person”导入{Person};
从“app/shared/factories/REQUEST factory/REQUEST factory.service”导入{RequestFactoryService,REQUEST_TYPES};
@可注射()
导出类PersonService{
私有请求服务:IRequest;
建造师(
_requestFactoryService:requestFactoryService
) {
这是.\u requestService=\u requestFactoryService.getStorage(REQUEST\u TYPES.HTTP);
}
公开注册(记录):承诺{
让url=environment.api+“person/public/signup”;
将此返回。_requestService.post(url,记录)作为承诺;;
}
公共身份验证(代码:string,密码:string):承诺{
让url=environment.api+'auth/signin';
让postData={
代码:代码,
密码:密码
}
将此._requestService.post(url,postData)作为承诺返回;
}
}
请求
请对此提出解决方案,我已经浪费了2天时间来解决这个问题,但运气不佳
非常感谢!!您必须提前修改response-interceptor.service.ts
import { Injectable,Inject, Injector } from '@angular/core';
constructor( inj: Injector) {
this._globalFunctionService=inj.get(GlobalFunctionService)
}
你可以得到更多的信息,循环依赖,意味着无止境的环绕,就像围绕太阳旋转的行星 解决方案:打破依赖链,重新考虑代码 您有全球功能服务->PersonService->等等…->响应InterceptorService->并返回到->全局功能服务
循环完成 从GlobalFunctionService中删除PersonService依赖项。(无论如何,它都不用,如果你需要它,那么就找不同的方式四处走动。) 在构造函数中使用setTimeout()函数分配服务
constructor(private injector: Injector) {
setTimeout(() => {
this.loginService = this.injector.get(LoginService);
})
}
请尝试此操作,如果遇到任何问题,请返回。列出您的联系人。很高兴再次见到您@RahulSingh我在问题中添加了
PersonService
。您可能自己也在其中注入了服务。我遇到了一个类似的问题,我已经将LoginServe注入到LoginService本身。我已经尝试过了,但它对我不起作用,并且超出了最大调用堆栈大小↵RangeError:Maximum call stack size Overed
它可以解决您当前的问题。现在您必须寻找Maximum call stack
error的解决方案。我不这么认为,因为正如您在解决方案中所看到的,它工作正常。为了确保这一点,您可以简单地跳过GlobalFunctionService
注入和注释行this.\u globalFunctionService.relogin()代码>然后检查你是否得到最大值..
错误我按照你说的做了,应用程序运行得很好@jitender因此,由于循环依赖性
,似乎出现了最大调用堆栈
问题。我需要全局函数服务中的person服务,因为我需要验证用户。你有没有办法建议处理这个问题?非常感谢您的时间兄弟。relogin(personService:personService){….},请避免使用构造函数。为了在relogin函数中传递person服务对象。。。我必须将person服务注入到响应拦截器服务中,该服务再次产生循环依赖。请推荐一些。。。让我看看差异,这只是一个让你行动的指针。。。。
constructor(private injector: Injector) {
setTimeout(() => {
this.loginService = this.injector.get(LoginService);
})
}