我试图使用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],
},
答案 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
}