是否可以通过可观察值设置OpaqueToken?
问题描述:
我想在使用observable的提供程序中设置opaquetoken。原因是我正在通过Http提供者(外部JSON文件)读取值。是否可以通过可观察值设置OpaqueToken?
这就是我想要做的
{
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],
},
答
APP_INITIALIZER
未记录的多提供程序应该用于异步解析应用程序相关性。
初始化器应该是一个返回promise(用于异步初始化)或任何其他值(用于同步初始化)的函数。由于APP_INITIALIZER
是多供应商,因此可以有许多初始化程序,它们将被并行执行并等待。实施是here。
它可以被定义为模块供应商:
{
provide: APP_INITIALIZER,
useFactory: (...deps...) =>() => promise,
deps: [...deps...],
multi: true
}
或为初始化,而不依赖关系:
{
provide: APP_INITIALIZER,
useValue:() => promise,
multi: true
}
您需要解决的依赖应用程序将被初始化之前。我想[APP_INITIALIZER](https://stackoverflow.com/search?q=app_initializer)有帮助。 – estus
谢谢@estus,有没有一个例子,在这里使用? – Yodacheese
尚未包含在参考文献中。您可以使用搜索,关于SO的许多回答问题涵盖APP_INITIALIZER,例如http://stackoverflow.com/a/38128065/3731501。 – estus