Приложение My Angular5 загружает файл конфигурации из бэкэнд во время инициализации приложения (APP_INITIALIZER). Поскольку приложение не может работать без него, моя цель - показать пользователю сообщение о невозможности загрузки конфигурации.
providers: [ AppConfig,
{ provide: APP_INITIALIZER, useFactory: (config: AppConfig) => () => config.load(), deps: [AppConfig], multi: true },
{ provide: LocationStrategy, useClass: HashLocationStrategy},
{ provide: ErrorHandler, useClass: GlobalErrorHandler }]
Класс AppConfig
должен загружать файл конфигурации из бэкэнд-сервиса до загрузки приложения:
@Injectable()
export class AppConfig {
private config: Object = null;
constructor(private http: HttpClient) {}
public getConfig(key: any) {
return this.config[key];
}
public load() {
return new Promise((resolve, reject) => {
this.http.get(environment.serviceUrl + 'config/config')
.catch((error: any) => {
return Observable.throw(error || 'Server error');
})
.subscribe((responseData) => {
this.config = responseData;
this.config['service_endpoint'] = environment.serviceUrl;
resolve(true);
});
});
}
}
Глобальный обработчик исключений:
@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
constructor( private messageService: MessageService) { }
handleError(error) {
// the AppConfig exception cannot be shown with the growl message since the growl component is within the AppComponent
this.messageService.add({severity: 'error', summary: 'Exception', detail: 'Global Exception Handler: ${error.message}'});
throw error;
}
}
Если файл конфигурации не может быть загружен, исключение будет выбрано, поймано и восстановлено в глобальном обработчике исключений (неотображаемый HTTPErrorResponse в console.log()), а загрузчик будет висит навсегда)
Поскольку AppComponent
не загружается (это нормально, поскольку приложение не может использоваться без конфигурации), и поскольку мой компонент message/"growl" является вспомогательным компонентом AppComponent
, я не могу отображать сообщение пользователю.
Есть ли способ показать сообщение на странице index.html
на этом этапе? Я не хотел бы перенаправлять пользователя на другую.html-страницу, чем index.html, так как тогда пользователи просто перезагрузили /f5 в файле error.html.