Une partie de mon code:
import {Injectable} from 'angular2/core';
import {Http, Headers, Request, Response} from 'angular2/http';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/map';
@Injectable()
export class myClass {
constructor(protected http: Http) {}
public myMethod() {
let request = new Request({
method: "GET",
url: "http://my_url"
});
return this.http.request(request)
.map(res => res.json())
.catch(this.handleError); // Trouble line.
// Without this line code works perfectly.
}
public handleError(error: Response) {
console.error(error);
return Observable.throw(error.json().error || 'Server error');
}
}
myMethod()
produit une exception dans la console du navigateur:
EXCEPTION ORIGINALE: TypeError: this.http.request (...). Map (...). Catch n'est pas une fonction
throw()
fonction. J'ai ajouté cette ligne à laimport 'rxjs/Rx';
place. Désormais, tous les opérateurs fonctionnent correctement..catch
cela fonctionne vraiment? Cela.subscribe()
fonctionne à coup sûr.EXCEPTION: TypeError: Observable_1.Observable.throw is not a function
. Il peut être corrigé avec la réponse @MattScarpino ou dans la manière de ce plunker comme je l'ai dit ci-dessus: angular.io/resources/live-examples/server-communication/ts/…import 'rxjs/add/observable/throw';
et n'importez pas tout, c'est trop énorme.Nouveau service mis à jour pour utiliser HttpClientModule et RxJS v5.5.x :
Ancien service, qui utilise le HttpModule obsolète:
J'utilise
.do()
( maintenant.tap()
) pour le débogage.Quand il y a une erreur de serveur, le
body
de l'Response
objet que je reçois du serveur j'utilise (lite-serveur) contient seulement du texte, d' où la raison pour laquelle je l' utiliseerr.text()
ci - dessus plutôt queerr.json().error
. Vous devrez peut-être ajuster cette ligne pour votre serveur.Si
res.json()
génère une erreur car il n'a pas pu analyser les données JSON,_serverError
n'obtiendra pas d'Response
objet, d'où la raison de lainstanceof
vérification.Dans ce plunker , changez
url
en./data/data.junk
pour générer une erreur.Les utilisateurs de l'un ou l'autre service doivent avoir un code capable de gérer l'erreur:
la source
Il y a plusieurs moyens de le faire. Les deux sont très simples. Chacun des exemples fonctionne très bien. Vous pouvez le copier dans votre projet et le tester.
La première méthode est préférable, la seconde est un peu dépassée, mais jusqu'à présent, elle fonctionne aussi.
1) Solution 1
2) Solution 2. Elle est ancienne mais fonctionne toujours.
la source
Les fonctions RxJS doivent être spécifiquement importées. Un moyen simple de le faire est d'importer toutes ses fonctionnalités avec
import * as Rx from "rxjs/Rx"
Assurez-vous ensuite d'accéder à la
Observable
classe en tant queRx.Observable
.la source
dans la dernière version d'angular4 use
il importera toutes les choses requises.
la source