在我的角度应用程序中,我正在使用APP_INITALIZER和GlobalERRORHandler。我的全局错误处理程序依赖于处理日志记录的服务。
export function loadConfig(config: ConfigService) => () => config.load()
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule,
routes,
FormsModule,
HttpModule],
providers: [
ConfigService,
{
provide: APP_INITIALIZER,
useFactory: loadConfig,
deps: [ConfigService],
multi: true
},
ErrorLoggingService,
{
provide: ErrorHandler,
useClass: GlobalErrorHandler,
deps: [ErrorLoggingService]
}
],
bootstrap: [AppComponent]
})
export class AppModule {
}
但是,我对ErrorLoggingService的实现还依赖于由角度DI注入的configService实现。
@Injectable()
export class ErrorLoggingService {
_errorLogAPIUrl: string;
seen = [];
constructor(private http: HttpClient, private config: ConfigService) {
config.load().then(e => (this._errorLogAPIUrl = config.errorLoggingUrl));
}
logClientError(error: Error): Observable<any> {
const convertedObservable = this.http.post<any>(
error
);
convertedObservable.subscribe(e => {});
return convertedObservable;
}
}
我的globalerrorhandler实现的定义如下。
@Injectable()
export class GlobalErrorHandler extends ErrorHandler {
constructor(
private _errorLogService: ErrorLoggingService
) {
super(true);
}
handleError(error: any): void {
this._errorLogService.logClientError(error);
throw error;
}
}
但是,由于ErrorHandler代码在APP_INITIALIZER运行之前运行,这意味着我没有在errorLogservice中使用配置,因此我遇到了问题,其中发生了错误且某些服务尚未连接。
有没有办法在角度内处理这样的场景。因此,在APP_INITALIZER加载之前,我有启动时的配置和服务。
我已经尝试过这个stackoverflow(Angular: APP_INITIALIZER with GlobalErrorHandler)的答案,但它打破了很多其他的东西,比如e2e和angular cli命令。