【问题标题】:Angular 4: Cannot instantiate cyclic dependency! InjectionToken_HTTP_INTERCEPTORSAngular 4:无法实例化循环依赖! InjectionToken_HTTP_INTERCEPTORS
【发布时间】:2018-11-15 00:04:37
【问题描述】:

我知道,这个问题听起来可能是重复的,我已经尝试了在 stackover flow 上找到的所有方法都无法解决这个问题,所以请多多包涵

为了让您能够重现错误,我提供给您的整个代码都认为是这样的

Github Repo

问题

我收到以下错误:

提供者解析错误:↵无法实例化循环依赖! InjectionToken_HTTP_INTERCEPTORS ("[ERROR ->]"):在 NgModule AppModule 中 在 ./AppModule@-1:-1

有关场景的信息(注释)

注意 1 档案:response-interceptor.service.ts

路径:./src/app/shared/interceptors/response-interceptor/

我正在拦截HTTPClient 响应以检查401 错误,当错误出现时我需要要求用户重新登录。

为了向用户显示重新登录提示,我创建了一个具有“重新登录”功能的 global-functions-services

注意 2 档案:global-function.service.ts

路径:./src/app/shared/services/helper-services/global-function/

这里是这一切开始发生的地方...... 只要我注入PersonService

  constructor(
    public dialog: MatDialog,
    private _personService: PersonService
  ) { }

我收到此错误,在 PersonService 中我找不到任何可能导致此问题的 import

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>;
  }
}

请求

请为此提出解决方案,我已经浪费了 2 天的时间来解决这个问题,但没有运气。

非常感谢!!提前

【问题讨论】:

  • 列出您的个人服务
  • 很高兴再次见到你。@RahulSingh 我在问题中添加了PersonService
  • 您可能自己向其中注入了服务。我遇到了类似的问题,我在 LoginService 本身中注入了一个 LoginServe。

标签: javascript angular circular-dependency


【解决方案1】:

循环依赖,意味着无限循环,就像行星围绕太阳运行一样......

解决方案:打破依赖链,重构代码。

您有 GlobalFunctionService -> PersonService -> 等等... -> ResponseInterceptorService -> 并返回 -> GlobalFunctionService
循环完成。

从 GlobalFunctionService 中删除 PersonService 依赖项。 (反正没用过,有需要就另找办法。)

      import { PersonService } from 'app/shared/services/api-services/person/person.service';
      import { Injectable } from '@angular/core';
      import { InputModalComponent } from 'app/shared/components/input-modal/input-modal.component';
      import { MatDialog } from '@angular/material';

      @Injectable()
      export class GlobalFunctionService {

        constructor(
          public dialog: MatDialog
        ) { }

        relogin(): void {
          let dialogRef = this.dialog.open(InputModalComponent, {
            width: '250px',
            data: { title: "Please provide your password to re-login." }
          });

          dialogRef.afterClosed().subscribe(result => {
            debugger
            console.log('The dialog was closed');
            let password = result;
          });
        }
      }

【讨论】:

  • 我需要全局功能服务中的人员服务,因为我需要验证用户。有没有办法可以建议处理这个问题?非常感谢您的时间兄弟。
  • relogin(personService: PersonService) {..... },避免构造函数。
  • 为了在重新登录函数中传递人员服务对象...我必须将人员服务注入响应拦截器服务,这再次产生循环依赖。请提出一些建议
  • 啊...让我看看
  • 查看差异,这只是一个让你移动的指针......github.com/bansalvks/simpleAngular4App/compare/…
【解决方案2】:

在构造函数中使用 setTimeout() 函数来分配服务。

constructor(private injector: Injector) {
  setTimeout(() => {
      this.loginService = this.injector.get(LoginService);
  })
}

如果遇到任何问题,试试这个并恢复。

【讨论】:

    【解决方案3】:

    你必须修改你的 response-interceptor.service.ts

    import { Injectable,Inject, Injector } from '@angular/core';
    
    constructor( inj: Injector) { 
       this._globalFunctionService=inj.get(GlobalFunctionService)
     }
    

    您可以获取更多信息From this link

    【讨论】:

    • 我已经尝试过了,但它对我不起作用并给了Maximum call stack size exceeded↵RangeError: Maximum call stack size exceeded
    • 它适用于您当前的问题,现在您必须寻找Maximum call stack错误的解决方案
    • 我不这么认为,因为正如您在 this plunker 中看到的那样,解决方案运行良好
    • 为确保这一点,您可以简单地跳过GlobalFunctionService 注入和注释行this._globalFunctionService.relogin();,然后检查您是否收到maximum.. 错误
    • 我按照你说的做了,应用程序运行完美...@jitender 所以看来问题Maximum call stack 由于cyclic dependency...
    猜你喜欢
    • 2017-05-05
    • 2019-12-03
    • 2016-11-14
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    相关资源
    最近更新 更多