138 votes

La propriété 'catch' n'existe pas sur le type 'Observable<any>'.

Sur la page de documentation d'Angular 2 pour l'utilisation du service Http, il y a un exemple.

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

J'ai cloné le angular2-webpack-starter et j'ai ajouté le code ci-dessus moi-même.

J'ai importé Observable en utilisant

import {Observable} from 'rxjs/Observable';

Je suppose que les propriétés Observable sont également importés ( .map fonctionne). J'ai regardé le journal des modifications de rxjs.beta-6 et rien n'est mentionné à propos de catch .

250voto

thierry templier Points 998

Avertissement : Cette solution est obsolète depuis Angular 5.5, veuillez vous référer à la réponse de Trent ci-dessous.

\=====================

Oui, vous devez importer l'opérateur :

import 'rxjs/add/operator/catch';

Ou importer Observable de cette façon :

import {Observable} from 'rxjs/Rx';

Mais dans ce cas, vous importez tous les opérateurs.

Voir cette question pour plus de détails :

2 votes

Savez-vous pourquoi les propriétés ne sont pas importées avec import {Observable} from 'rxjs/Observable'; ? Cela me semble plus intuitif.

6 votes

Parce que Rxjs est conçu comme ça. Le site rxjs/Observable n'importe pas les opérateurs parce qu'il y a beaucoup d'opérateurs. Le site rxjs/Rx le module importe tout... Je pense que c'est un choix de conception.

4 votes

L'importation de rxjs/Rx ralentit vraiment le chargement des pages. Comparez le nombre de requêtes avec et sans rxjs/Rx : deux fois moins de requêtes si vous n'utilisez pas rxjs/Rx mais par exemple rxjs/Observable.

107voto

Trent Points 2071

Avec RxJS 5.5+, la fonction catch est désormais obsolète. Vous devez maintenant utiliser l'opérateur catchError opérateur en conjonction avec pipe .

RxJS v5.5.2 est la version de dépendance par défaut pour Angular 5.

Pour chaque opérateur RxJS que vous importez, notamment catchError vous devez maintenant importer de 'rxjs/operators' et utiliser l'opérateur pipe.

Exemple de capture d'erreur pour une requête Http Observable

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) => {
        ...
      }
    )
  }
  ...
}

Notez ici que catch est remplacé par catchError y el pipe est utilisé pour composer les opérateurs de manière similaire à ce que vous avez l'habitude de faire avec la chaînage par points.


Voir la documentation rxjs sur pipable (précédemment connu sous le nom de louable ) pour plus d'informations.

0 votes

Est map(res => res) nécessaire ?

1 votes

Non, le RxJS pipe vous permet de combiner plusieurs fonctions en une seule. La fonction pipe() prend comme arguments les fonctions que vous voulez combiner, et renvoie une nouvelle fonction qui, lorsqu'elle est exécutée, exécute les fonctions composées en séquence. Ce mappage ne fait rien, puisqu'il s'agit techniquement d'une fonction d'identité.

11voto

Prince Babbar Points 96

En angulaire 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');
  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X