angular2 APP_INITIALIZER同步

时间:2016-12-14 11:21:21

标签: angular angular2-services

我需要在角度初始化之前一个接一个地进行两次HTTP调用。有没有办法同步初始化角度2?

请不要说我们的应用应该异步工作。 我正在使用“angular-cli”进行通用构建。首先,我需要获取在json文件中设置的环境,并根据该环境我需要加载配置。所以我需要两个HTTP调用。

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

内部加载()我在其他内部有两个http调用,但在两次调用之前,完成了初始化的角度。

1 个答案:

答案 0 :(得分:3)

你的方式正确。 您可以将两个http调用到config.load()函数。

 public load() {
    return new Promise((resolve, reject) => {
        this.http.get('first.json').map( res => res.json() ).catch((error: any):any => {

            console.error('Error at first call');

            resolve(error);
            return Observable.throw(error.json().error || 'Server error');
        }).subscribe( (firstResponse) => {

            let request = this.http.get('second.json');

            request
                .map( res => res.json() )
                .catch((error: any) => {
                    console.error('Error at second call');
                    resolve(error);
                    return Observable.throw(error.json().error || 'Server error');
                })
                .subscribe((secondResponse) => {

                    //Here i have both
                    firstResponse, secondResponse

                    resolve(true);
                });

        });

    });
}

考虑到useFactory不再支持函数和lambda的事实,所以你必须重写一点。还要确保提供AppConfig

function initialConfigLoad(config: AppConfig) {
    return () => config.load();
};

providers: [
    ...
    AppConfig, // <- Provide AppConfig
    {
        provide: APP_INITIALIZER,
        useFactory: initialConfigLoad,
        deps: [AppConfig],
        multi: true
    }
]