Javascript 角度4:无法实例化循环依赖项!InjectionToken_HTTP_拦截器

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

我知道,这个问题听起来可能是重复的,我已经尝试了stackover flow上的所有方法无法解决这个问题,所以请容忍我

为了使您能够重现错误,我提供了所有代码

问题

我得到以下错误:

提供程序分析错误:↵无法实例化循环依赖项! InjectionToken_HTTP_拦截器(“[ERROR->]”):在NgModule AppModule中 在./AppModule@-1:-1中

有关场景的信息(注意事项)

注1 文件:

路径:
/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);
  })
}