У меня есть приложение Angular/JHipster, которое вызывает HTTP-вызовы. Я хочу сделать обработку ошибок в моих подписках Observable
.
Однако при первом вызове обработчика ошибок объект err
не является ответом, он представляет собой raw {}
Object
. Все последующие вызовы обработчика ошибок имеют действительный Response
.
Почему это происходит, и как его исправить?
MyComponent.ts:
handleClickPost() {
this.myService.doPost(this.body)
.subscribe(
(res: Response) => {
this.responseOk = true;
},
(err: Response) => {
// This is a HACK!
// For some reason, the first time this error handler is invoked (after page load),
// the response body is empty here and serializes to "{}".
if (JSON.stringify(err) === '{}') {
// first request always reaches here... WHY?
this.handleClickPost(); // NB: workaround
// err.json(); // results in null "method not found" error
} else {
// second request always reaches here... WHY?
// (I want all requests to go here with a valid 'Response' object)
this.showRequestFailed = true;
this.errorResponse = err.json();
}
}
);
}
MyService.ts:
doPost(body): Observable<Response> {
return this.http.post(this.resourceUrl, body);
}
Мое дрянное обходное решение - просто вызвать метод снова после первого отказа пустого тела, чтобы получить типизированный Response
.
Примечание. Такое поведение происходит как с Angular 2, так и с Angular 4.