【发布时间】:2019-04-02 19:17:33
【问题描述】:
我有一个跨平台的 Angular 应用程序,我需要检查应用程序运行的平台,然后根据此信息决定注入服务。这是我的结构:
@NgModule({
providers: [
ConfigService,
{
provide: APP_INITIALIZER,
useFactory: configFactory,
deps: [ConfigService],
multi: true
},
{
provide: UserService,
useFactory: userServiceFactory,
deps: [
ConfigService
],
multi: true
},
],
bootstrap: [AppComponent]
})
export class AppModule { }
配置工厂返回一个 Promise:
export function configFactory(configService: ConfigService): () => Promise<any> {
return (): Promise<any> => {
return new Promise(resolve => {
Device.getInfo().then(info => {
configService.platform = info.platform; // it either ios or web
});
});
}
}
需要 configService.platform 来决定 UserService 提供者,因此我有它的工厂方法:
const userServiceFactory = (configService: ConfigService): any => {
if(configService.platform === 'ios') {
return new UserServiceDevice()
} else {
return new UserWebServiceWeb();
}
}
配置服务初始化正确,但在完成之前,growerServiceFactory 运行并获取未定义的 config.platform,因此即使在将 ConfigService 设置为依赖项之后,它本质上也不会等待 configFactory 解析。我该如何做到这一点?对于这种情况有更好的方法吗?
【问题讨论】:
-
首先,你为什么使用
multi: true?您是否有多个ConfigService和UserService实例?其次,我认为configFactory应该返回ConfigService的实例,即它应该是Promise<ConfigService>,并相应地修复。
标签: angular typescript dependency-injection angular6