在APP_INITIALIZER

时间:2019-03-21 07:26:40

标签: angular

我有一个ConfigFactory。它的工作是检索应用程序配置(外部json文件)并保存在ConfigService中。

应用模块

providers: [
    {
        provide: APP_INITIALIZER,
        useFactory: configurationFactory,
        deps: [ConfigurationService],
        multi: true
    }
]

问题:另一个Angular Service需要在其自身的构造函数中的应用配置信息 。但是在此时间点(应用程序初始化阶段),配置信息为未定义

现在,我尝试使用useValue = configs创建一个InjectionToken,以便它可以在@Inject(TEST_DATA)中成为ServiceB。但是它似乎不起作用。

configurationFactory

export const TEST_DATA = new InjectionToken<any>('TestData');

export function configurationFactory(configService: ConfigService): () => Promise<any> {
    return (): Promise<any> => {
        return new Promise((resolve, reject) => {
            http.get('externalPath').then((config) => {
                // save Config in configService
                return configService.saveConfig(config);
            }).then((config) => {
                // attempt save config. Example: config contains 'hello'
                resolve({ provide: TEST_DATA, useValue: config });
            }).catch(() => {
                reject();
            });
        });
    };
}

ServiceB构造函数中使用TEST_DATA

@Injectable()
export class ServiceB{

    constructor(@Inject(TEST_DATA) public data: any) {
        console.log('ServiceB', data); 
        // however this prints 'TEST_DATA'. Expected: 'hello'
    }

如何允许另一个Service构造函数获取由APP_INITIALIZER/configurationFactory解析的数据?

1 个答案:

答案 0 :(得分:0)

有多种方法可以做到这一点。

最简单的方法是从ConfigurationService中公开一个可观察对象,并在ServiceB中使用它。尽管这需要ServiceB才能将ConfigurationService声明为依赖项。

现在,一旦加载了配置,您就可以始终通过可观察对象发出它。此外,您还可以更好地控制通过ConfigurationService

发出期望值的过程