Подтвердить что ты не робот

Свойство 'catch' не существует в типе 'Observable <any>'

На странице документации Angular 2 для использования службы Http приведен пример.

getHeroes (): Observable<Stuff[]> {
  return this.http.get(this.url)
                  .map(this.extractData)
                  .catch(this.handleError);
}

Я клонировал проект angular2-webpack-starter и сам добавил код выше.

Я импортировал Observable, используя

import {Observable} from 'rxjs/Observable';

Я предполагаю, что свойства Observable также импортируются (.map works). Посмотрел журнал изменений для rxjs.beta-6, и ничего не упоминается о catch.

4b9b3361

Ответ 1

Да, вам нужно импортировать оператор:

import 'rxjs/add/operator/catch';

Или импортируйте Observable следующим образом:

import {Observable} from 'rxjs/Rx';

Но в этом случае вы импортируете все операторы.

См. этот вопрос для получения дополнительной информации:

Ответ 2

С RxJS 5.5+ оператор catch теперь устарел. Теперь вы должны использовать оператор catchError в сочетании с pipe.

RxJS v5.5.2 - версия зависимости по умолчанию для Angular 5.

Для каждого импортируемого оператора RxJS, включая catchError, вы должны импортировать из "rxjs/operator" и использовать оператор pipe.

Пример ошибки улавливания для запроса Http Наблюдаемый

import { Observable } from 'rxjs/Observable';
import { catchError } from 'rxjs/operators';
...

export class ExampleClass {
  constructor(private http: HttpClient) {
    this.http.request(method, url, options).pipe(map(res => res),
      catchError((err: HttpErrorResponse) => {
        ...
      }
    )
  }
  ...
}

Обратите внимание, что catch заменяется на catchError, а оператор pipe используется для компоновки операторов аналогично тому, с чем вы привыкли, с цепочкой точек.


Дополнительную информацию см. в документации rxjs для операторов lettable. https://github.com/ReactiveX/rxjs/blob/master/doc/lettable-operators.md