Ответ 1
Я думаю, проблема в том, что вы не throwing
ошибка с Observable.throw(errMsg)
.
Итак, вы можете просто использовать его следующим образом:
.catch((error:any) => Observable.throw(error.json().error || 'Server error'));
В вашем примере:
create(member: Member): Observable<any> {
return this.http
.post(this.RESOURCE_BASE_URL, member)
.map(response => {
if (response.status === 200) this.toastsSerivce.success(this.translateService.instant('lbl_users_member_created'));
return response;
})
.catch((error:any) => Observable.throw(this.toastsSerivce.error(this.translateService.instant('lbl_users_member_create_failed'))));
}
Но вы можете использовать обработчик ошибок, например, тот, который Angular предлагает здесь:
private handleError (error: Response | any) {
// In a real world app, you might use a remote logging infrastructure
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || '';
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
Итак, ваш метод будет выглядеть примерно так:
create(member: Member): Observable<any> {
return this.http
.post(this.RESOURCE_BASE_URL, member)
.map(response => {
if (response.status === 200) this.toastsSerivce.success(this.translateService.instant('lbl_users_member_created'));
return response;
})
.catch(this.handleError);
}
Он действительно более чистый и многоразовый для других методов, которые вы можете создать в своей службе.
Я бы предложил использовать также обработчик ответа, например тот, который используется Angular devs: this.extractData
.
Obviusly, внутри метода дескриптора ошибки вы можете поместить свою собственную логическую, в зависимости от того, как вы хотите показать или обработать ошибку.
ПРИМЕЧАНИЕ. Я не тестировал ваш код и код, который я разместил здесь. Но я хотел показать/выразить концепцию. Вы должны выбросить ошибку, чтобы не входить в success
каждый раз. Как вы справляетесь с этим, это зависит от вас и вашего приложения.