La proprietà "catch" non esiste sul tipo "Osservabile <any>"


127

Nella pagina della documentazione di Angular 2 per l'utilizzo del servizio Http, c'è un esempio.

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

Ho clonato il progetto angular2-webpack-starter e ho aggiunto il codice sopra.

Ho importato Observableusando

import {Observable} from 'rxjs/Observable';

Suppongo che anche le proprietà Observablevengano importate ( .mapfunziona). Ho esaminato il log delle modifiche per rxjs.beta-6 e non è stato menzionato nulla catch.

Risposte:


246

Avvertenza : questa soluzione è obsoleta a partire da Angular 5.5, fare riferimento alla risposta di Trento di seguito

=====================

Sì, è necessario importare l'operatore:

import 'rxjs/add/operator/catch';

O importa in Observablequesto modo:

import {Observable} from 'rxjs/Rx';

Ma in questo caso, importi tutti gli operatori.

Vedi questa domanda per maggiori dettagli:


2
Sai perché le proprietà non vengono importate con import {Observable} from 'rxjs/Observable';? Mi sembra più intuitivo.
BrianRT,

6
Perché Rxjs è progettato in questo modo. Il rxjs/Observablemodulo non importa gli operatori perché ci sono molti operatori. Il rxjs/Rxmodulo importa tutto ... Penso che sia una scelta progettuale.
Thierry Templier,

4
l'importazione da rxjs / Rx rallenta il caricamento della pagina. confronta il conteggio delle richieste con esso v senza = metà delle richieste quando non usi rxjs / Rx ma usi ad esempio rxjs / Observable
danday74

L'importazione rxjs / Rx spesso non lascia più nulla, è un'importazione nella lista nera. So che in passato questo è stato visto come un po 'ok (e l'ho fatto), ma al giorno d'oggi non dovrebbe mai far parte di una risposta corretta per qualcosa di diverso da giocare.
Tim Consolazio,

93

Con RxJS 5.5+, l' catchoperatore è ora obsoleto. Ora dovresti usare l' catchErroroperatore insieme a pipe.

RxJS v5.5.2 è la versione di dipendenza predefinita per Angular 5.

Per ogni operatore RxJS che importi, incluso catchErrorora dovresti importare da "rxjs / operatori" e utilizzare l'operatore pipe.

Esempio di errore di rilevazione per una richiesta HTTP osservabile

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

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

Si noti che catchviene sostituito con catchErrore l' pipeoperatore viene utilizzato per comporre gli operatori in modo simile a quello a cui si è abituati con il concatenamento punti.


Per ulteriori informazioni, consultare la documentazione di rxjs sugli operatori pipable (precedentemente noti come lettable ).


è map(res => res)richiesto?
Pieter De Bie,

1
No, la pipefunzione RxJS ti consente di combinare più funzioni in una singola funzione. La funzione pipe () prende come argomenti le funzioni che si desidera combinare e restituisce una nuova funzione che, quando eseguita, esegue le funzioni composte in sequenza. Tale mappatura non fa nulla, dal momento che tecnicamente è una funzione identitaria.
Trento

1
In angular 8:
for catch:
import { catchError } from 'rxjs/operators';

for throw:
import { Observable, throwError } from 'rxjs';

and code should be written like this.

getEmployees(): Observable<IEmployee[]> {
    return this.http.get<IEmployee[]>(this.url).pipe(catchError(this.erroHandler));
  }

  erroHandler(error: HttpErrorResponse) {
    return throwError(error.message || 'server Error');
  }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.