【问题标题】:Angular "Maximum call stack size exceeded" when use injector使用注入器时角度“超出最大调用堆栈大小”
【发布时间】:2017-11-28 12:40:02
【问题描述】:

我创建了 Angular 5 项目并创建了一个工厂,它应该在应用程序启动之前从服务中提供元数据。 问题是我收到错误:

RangeError: Maximum call stack size exceeded
    at resolveNgModuleDep (core.js:10559)
    at _callFactory (core.js:10649)
    at _createProviderInstance$1 (core.js:10599)
    at resolveNgModuleDep (core.js:10581)
    at _createClass (core.js:10622)
    at _createProviderInstance$1 (core.js:10596)
    at resolveNgModuleDep (core.js:10581)
    at NgModuleRef_.get (core.js:11806)
    at new MetadataService (metadata.service.ts:23)
    at _createClass (core.js:10622)

应用模块:

@NgModule({
  declarations: [
      AppComponent,
      ...
  ],
  imports: [
      BrowserModule,
      HttpClientModule,
      AppRoutingModule,
      FormsModule,
      FlexLayoutModule,
      I18NextModule.forRoot()
  ],
  providers: [
      { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true },
      MetadataService,
      { provide: APP_INITIALIZER, useFactory: MetadataProviderFactory, deps: [MetadataService], multi: true },
      { provide: APP_INITIALIZER, useFactory: I18NextProviderFactory, deps: [I18NEXT_SERVICE], multi: true }      
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

元数据服务:

import { Injectable, Injector } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { HttpClient } from '@angular/common/http';   

@Injectable()
export class MetadataService {   
    private http: HttpClient;

    constructor(private injector: Injector) { 
        this.http = injector.get(HttpClient);  // this row makes a problem
    }

这一行有问题。

 this.http = injector.get(HttpClient);

我把这条线避免循环引用,我得到“最大调用堆栈大小超出”。 我哪里错了?

【问题讨论】:

  • 为什么不在构造函数中注入HttpClient
  • 因为我得到“无法实例化循环依赖!”错误。
  • @Milos 有什么更新吗?我遇到了类似的问题,我可以通过使用 setTimeout 延迟 http 调用来修复它。 (我在服务创建的那一刻就打了电话)
  • @Ka Mok 我用你的建议解决了我的问题。实际上,我将 injector.get(HttpClient) 推迟到我的方法而不是构造函数中。它与您对超时所做的类似,可能无法在构造函数中执行此操作。您可以添加您的评论作为答案:)。

标签: javascript angular


【解决方案1】:

您可以通过简单的setTimeOut(不需要任何秒)延迟在服务初始化时进行的 http 调用来暂时克服这个问题。我经历了一些开放的 Angular 线程,主要问题与 HttpInterceptor 和 HttpClient 的循环依赖有关。

【讨论】:

    猜你喜欢
    • 2016-04-20
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2015-10-24
    • 2015-12-29
    相关资源
    最近更新 更多