Teil meines Codes:
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()
erzeugt eine Ausnahme in der Konsole des Browsers:
ORIGINAL AUSNAHME: TypeError: this.http.request (...). Map (...). Catch ist keine Funktion
throw()
Funktion. Ich habeimport 'rxjs/Rx';
stattdessen diese Zeile hinzugefügt . Jetzt funktionieren alle Bediener ordnungsgemäß..catch
wirklich funktioniert? Das.subscribe()
funktioniert sicher.EXCEPTION: TypeError: Observable_1.Observable.throw is not a function
. Es kann mit der Antwort @MattScarpino oder in der Manier von diesem Plunker aus behoben werden, wie ich oben sagte: angle.io/resources/live-examples/server-communication/ts/…import 'rxjs/add/observable/throw';
und importieren Sie nicht alles, es ist zu groß.Neuer Dienst aktualisiert, um HttpClientModule und RxJS v5.5.x zu verwenden :
Alter Dienst, der das veraltete HttpModule verwendet:
Ich benutze
.do()
( jetzt.tap()
) zum Debuggen.Wenn ein Serverfehler auftritt, wird der
body
vonResponse
Objekt , das ich vom Server erhalte Ich verwende (lite-Server) enthalten nur Text, daher auch den Grund , warum ich verwendeerr.text()
oben statterr.json().error
. Möglicherweise müssen Sie diese Zeile für Ihren Server anpassen.Wenn
res.json()
ein Fehler ausgelöst wird, weil die JSON-Daten nicht analysiert werden konnten,_serverError
wird keinResponse
Objekt abgerufen, daher der Grund für dieinstanceof
Überprüfung.In diesem plunker, ändern
url
sich, um./data/data.junk
einen Fehler zu erzeugen.Benutzer beider Dienste sollten über Code verfügen, der den Fehler behandeln kann:
quelle
Es gibt verschiedene Möglichkeiten, dies zu tun. Beide sind sehr einfach. Jedes der Beispiele funktioniert hervorragend. Sie können es in Ihr Projekt kopieren und testen.
Die erste Methode ist vorzuziehen, die zweite ist etwas veraltet, aber bisher funktioniert sie auch.
1) Lösung 1
2) Lösung 2. Es ist ein alter Weg, funktioniert aber immer noch.
quelle
Die RxJS-Funktionen müssen speziell importiert werden. Eine einfache Möglichkeit, dies zu tun, besteht darin, alle Funktionen mit zu importieren
import * as Rx from "rxjs/Rx"
Stellen Sie dann sicher, dass Sie auf die
Observable
Klasse als zugreifenRx.Observable
.quelle
in der neuesten Version von angle4 verwenden
Es werden alle erforderlichen Dinge importiert.
quelle