Angular 2: http.get в Observable не обрабатывает ошибку

Я использую observables для вызовов Http, которые работали нормально, но затем я изменил свои контроллеры и заметил, что мой код, по-видимому, не обрабатывает ошибки.

Вот посмотрите на код моего сервиса (SellingMenuService):

public getVarieties(): Observable<any> {
    return this.http.get(this.varietyListUrl).map(response => {
        return response.json();
    }, (error: any) => {
        console.log(error);
        console.log('error finding variety list');
        // TODO: implement error handling here.
    });
}

И вот соответствующий код из моего компонента:

constructor(public sellingMenuService: SellingMenuService) { }

getVarietyList(): void {        
    this.sellingMenuService.getVarieties().subscribe(res => {            
        console.log(res);
        this.varieties = res;
    });         
}

И вот несколько ошибок в моей консоли: введите здесь описание изображения

Если я получаю сообщение об ошибке 500, не должны ли эти консольные журналы из моего вышеприведенного сервиса пострадать? Почему нет?


person Bryan    schedule 27.10.2016    source источник
comment
Вот официальный рекомендуемый способ для обработки исключений HTTP-запросов от Angular.io. В нижней части страницы есть ссылка на живой пример на Plunker (перейдите на /app/toh/hero.service.ts, чтобы увидеть код клиентской службы HTTP).   -  person Alex Klaus    schedule 29.05.2017


Ответы (2)


Вы пытаетесь поймать ошибку в методе map, в то время как вы должны делать это внутри subscribe.

public getVarieties(): Observable<any> {
    return this.http.get(this.varietyListUrl).map(response => {
        return response.json();
    }).subscribe((res: any) => {
        console.log(res);
    }, (error: any) => {
        console.log(error);
        console.log('error finding variety list');
        // TODO: implement error handling here.
    });
}

Вы также можете добавить третий параметр к наблюдаемому. Это будет разрешено, когда observable будет finalized:

public getVarieties(): Observable<any> {
    return this.http.get(this.varietyListUrl).map(response => {
        return response.json();
    }).subscribe((res: any) => {
        console.log(res);
    }, (error: any) => {
        console.log(error);
        console.log('error finding variety list');
        // TODO: implement error handling here.
    }, () => {
        console.log("finalized")
    });
}

Вы можете прочитать больше здесь: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html

person Maciej Treder    schedule 27.10.2016
comment
Я попробовал ваш код и получил следующую ошибку сборки: Тип «Подписка» не может быть назначен типу «Наблюдаемый‹любой›» - person Bryan; 27.10.2016
comment
Можешь воспроизвести в plunkr? - person Maciej Treder; 27.10.2016

Похоже, у вас есть логика обработки ошибок внутри map().

import 'rxjs/add/operator/catch';

return this.http.request(request)
  .map(res => res.json())
  .subscribe(
    data => console.log(data),
    err => console.log(err),
    () => console.log('yay')
  );

См.: Как правильно перехватить исключение из http.request()?

person Dan Wilson    schedule 27.10.2016