首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >运行时角APP_INITIALIZER循环依赖项

运行时角APP_INITIALIZER循环依赖项
EN

Stack Overflow用户
提问于 2019-09-09 09:08:11
回答 1查看 739关注 0票数 2

我有一个循环依赖项(在运行时!)问题,我不知道该怎么解决。

我已经注册了一个APP_INITIALIZER加载函数,它加载一个config.json文件。此配置文件除其他外包含LogLevel for NGXLogger。配置文件通过角的HttpClient加载。

除此之外,我注册了一个HttpInterceptor,它使用NGXLogger

似乎角试图按照这个顺序来解决所有的问题:

  1. APP_INITIALIZER,所以首先运行这个函数
  2. 初始化器的Load函数触发一个http调用,所以首先通过拦截器运行
  3. HttpInterceptor => NGXLogger的加载依赖项
  4. 根据NGXLogger =>中的配置文件为APP_INITIALIZER配置提供程序
  5. 抛出错误,配置未定义。

如何解决这个循环依赖关系?有没有办法完全跳过APP_INITIALIZER http调用上的拦截器?

CoreModule.ts:

代码语言:javascript
运行
复制
export function appConfigFactory(configService: AppConfigService) {
  return () => configService.load();
}

export function loggerConfigFactory(configService: AppConfigService): {
  return () => {
    level: (NgxLoggerLevel as any)[configService.config.logLevel] || NgxLoggerLevel.ERROR,
  };
}

@NgModule({
  ...
  providers: [{
    provide: APP_INITIALIZER,
    useFactory: appConfigFactory,
    deps: [AppConfigService],
    multi: true
  }, {
    provide: NgxLoggerConfig,
    useFactory: loggerConfigFactory,
    deps: [AppConfigService]
  }]
})
export class CoreModule {}

AppConfigService.ts:

代码语言:javascript
运行
复制
export class AppConfigService {
  constructor(private http: HttpClient) {}

  load() {
    return this.http
      .get<AppConfig>(`/assets/configuration/${environment.configFile}`)
      .pipe(
        tap((config: any) => {
          this.config = config;
        })
      )
      .toPromise();
  }
}

FakeBackendInterceptor:

代码语言:javascript
运行
复制
@Injectable()
export class FakeBackendInterceptor implements HttpInterceptor {
    constructor(private configService: AppConfigService, private logger: NGXLogger) { }

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // config is undefined here the first time
        if (!this.configService.config || !this.configService.config.mock === 'true') {
            return next.handle(request);
        }
        this.logger.info('Intercepting request with mock');
        // do things
        ...
        return next.handle(request);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-09 09:33:44

可以使用HttpBackend跳过配置服务中的拦截器。

代码语言:javascript
运行
复制
constructor(
    private http: HttpClient,
    private httpBackend: HttpBackend) { }

在荷载法中

代码语言:javascript
运行
复制
const httpClient = new HttpClient(this.httpBackend);
httpClient.get<AppConfig>(`/assets/configuration/${environment.configFile}`)
.pipe(
    tap((config: any) => {
      this.config = config;
    })
  )
  .toPromise();
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57850927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档