是否可以通过observable设置OpaqueToken?

时间:2016-09-29 22:58:46

标签: angular typescript

我试图使用observable在提供者中设置opaquetoken。原因是我通过Http提供程序(外部JSON文件)读取值。

这就是我想要做的事情

    {
        provide: SOME_OPAQUE_TOKEN,
        useFactory: (configService: ConfigService) => {
            configService.getPath('campaigns')
               .subscribe((res) => {
                   ???
               });
        },
        deps: [ConfigService],
    },

显然这不起作用,但我想知道是否有这种问题的解决方案?

或者,如果它实际上可以使用useFactory来构造服务,其中一个参数是异步检索的。

有可能吗?

编辑:使用APP_INITIALIZER解决方案

在AppModule中:

{
  provide: APP_INITIALIZER,
  useFactory: (configService: ConfigService) => () => configService.load(),
  multi: true,
  deps: [ConfigService, Http],
},

在ConfigService中加载():

public load(): Promise<Configuration> {
    let promise =
        this.http
            .get('config.json')
            .map(m => m.json())
            .toPromise();

    promise
        .then(config => this.appConfig = config);

    return promise;
}

设置appConfig后,我们可以用它来设置OpaqueToken:

    {
        provide: BASE_PATH,
        useFactory: (configService: ConfigService) => configService.appConfig.basePath, deps: [ConfigService],
    },

1 个答案:

答案 0 :(得分:2)

APP_INITIALIZER未记录的多提供程序应该用于异步解析应用程序依赖项。

初始化程序应该是一个返回promise(用于异步初始化)或任何其他值(用于同步初始化)的函数。由于APP_INITIALIZER是多提供者,因此可以有许多初始化器,它们将并行执行并等待。实施是here

它可以在模块中定义为提供者:

{
  provide: APP_INITIALIZER,
  useFactory: (...deps...) => () => promise,
  deps: [...deps...],
  multi: true
}

或者对于没有依赖项的初始化程序:

{
  provide: APP_INITIALIZER,
  useValue: () => promise,
  multi: true
}