我正在使用angular(4.x.x),我正在努力解决使用http请求生成的错误。
在this plnkr中,我试图总结一个案例。我正在生成一些错误并尝试记录它们。当我因http调用而产生错误时,角度变化检测似乎中断,我错过了第一个http错误。
我正在使用ErrorHandler实现来拦截错误
@Injectable()
export class CustomExceptionHandler extends ErrorHandler {
constructor(private errMsgService: ErrorMessageService) {
super();
}
public handleError(err: any): void {
let localErr = err;
if (err.originalException) {
localErr = err.originalException;
}
if (localErr instanceof CustomException) {
console.log(`Handling CustomException`);
// stream errors through the service
this.errMsgService.addError(localErr);
} else {
super.handleError(err);
}
}
}
并将其记录在服务中:
@Injectable()
export class ErrorMessageService {
private errorMessagesEmitter:ReplaySubject<CustomException> = new ReplaySubject<CustomException>();
errorMessages = this.errorMessagesEmitter.asObservable();
public addError(err: any) {
this.errorMessagesEmitter.next(err);
}
}
在plunker中,我只是在监听ErrorMessageService并打印生成的错误。当错误从Http开始时我错过了一个错误。
如果我取消app.ts第36行,我强制勾选(),错误可以正确显示。
this.errMsgService.errorMessages.subscribe(e => {
this.errorCount++;
this.errors.push({ 'error': e, 'count': this.errorCount});
this.errorToConsole(e);
// this.appRef.tick();
});
这是预期的行为吗?否则我做错了什么?
更新
观察最近的角度变化,我专注于此:[https://github.com/angular/angular/commit/a1bb9c2]。 我决定尝试在NgZone中启动我的示例错误处理,并修改了plnkr
this.ngZone.run(() => {
// stream errors through the service
this.errMsgService.addError(localErr);
});
通过这项修改,它正在发挥作用。