代码之家  ›  专栏  ›  技术社区  ›  Vikas Bansal

角度4:无法实例化循环依赖!InjectionToken\u HTTP\u拦截器

  •  13
  • Vikas Bansal  · 技术社区  · 7 年前

    我知道,这个问题听起来可能重复,我已经尝试了在叠加流上发现的一切无法解决这个问题,所以 请容忍我

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

    Github Repo

    问题

    我收到以下错误:

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

    enter image description here

    有关场景的信息(注释)

    注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

    个人服务 :
    ./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天的时间来解决这个问题,但没有运气。

    非常感谢!!提前

    3 回复  |  直到 7 年前
        1
  •  9
  •   dipak    7 年前

    循环依赖性,意味着围绕无尽的行星旋转,就像围绕太阳旋转的行星一样。。

    解决方案:打破依赖链,重新考虑代码。

    你有 全球功能服务 -&燃气轮机;个人服务->等等-&燃气轮机;响应接收器服务->返回-> 全球功能服务 .

    从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;
              });
            }
          }
    
        2
  •  5
  •   Jayendra Bariya    6 年前

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

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

    试试这个,如果你面临任何问题,请回复。

        3
  •  4
  •   jitender    7 年前

    您必须修改响应拦截器。服务输电系统

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

    你可以获得更多信息 From this link