是否可以通过可观察值设置OpaqueToken?

是否可以通过可观察值设置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], 
    }, 
+0

您需要解决的依赖应用程序将被初始化之前。我想[APP_INITIALIZER](https://stackoverflow.com/search?q=app_initializer)有帮助。 – estus

+0

谢谢@estus,有没有一个例子,在这里使用? – Yodacheese

+0

尚未包含在参考文献中。您可以使用搜索,关于SO的许多回答问题涵盖APP_INITIALIZER,例如http://stackoverflow.com/a/38128065/3731501。 – estus

APP_INITIALIZER未记录的多提供程序应该用于异步解析应用程序相关性。

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

它可以被定义为模块供应商:

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

或为初始化,而不依赖关系:

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