2017-11-21 3 views
3

Ich bekomme diesen sehr ärgerlichen Fehler, wenn ich meinen Code von einer Unix-Umgebung aus führe. Das funktioniert gut, wenn ich den Code lokal durch ng serve laufen, aber wenn ich den Code auf meinem Server bereitstellen, hält dieser Fehler alle Programmausführung:Observable .Catch ist keine Funktion

ERROR TypeError: this.http.get(...).catch is not a function

Google Ergebnisse Zustand, dass ich rxjs importieren sollte Namespaces direkt von ihrem Standort und nicht durch das Rxjs/Rx-Bundle, aber ich bekomme diesen Fehler unabhängig. Andere Ergebnisse weisen darauf hin, dass ich den Import von rxjs-Operatoren möglicherweise verpasst habe, aber sie sind definitiv in meinem Fall enthalten.

Ich habe sogar die mitgelieferten Quellkarten mit DevTools überprüft, und die Operatoren sind im Browser enthalten.

Kann mir jemand sagen, warum ich diesen Fehler bekomme? Ich benutze rxjs:^5.5.2

Das ist mein Code.

import { Injectable } from '@angular/core'; 
import { HttpClient } from '@angular/common/http'; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/catch'; 
import 'rxjs/add/observable/throw'; 

@Injectable() 
export class MyService { 
    constructor(private http: HttpClient) {} 

    all(): Observable<any> { 
    return this.http.get<any>('url') 
     .catch(err => this.handleError(err)); 
    } 
    handleError(error) { 
    return Observable.throw(error); 
    } 
} 

EDIT Basierend auf @ unter Jota.Toledo Kommentar, werde ich den Code mit dieser Methode bieten:

this.myService.all().subscribe(
    result => { 
    this.isLoading = false; 
    if (result) { 
     this.clients = result; 
    } 
    }, 
    error => this.isLoading = false 
); 

wie dies in abonnieren zwei Callback-Funktionen geben, das gleiche wie "Verwenden Sie die Fangmethode irgendwo, bevor der Operator hinzugefügt wird"?

+0

Welche Version von RXJS verwenden Sie? – Aravind

+0

Bearbeitet die Frage @Aravind –

+0

Sind Sie sicher, dass das Problem von diesem Code-Snippet kam? der Operator-Import ist in Ordnung, höchstwahrscheinlich verwenden Sie die Fangmethode irgendwo, bevor der Operator hinzugefügt wird –

Antwort

4

In können Sie dieses Problem mit Lettetable-Operator in diesem Fall catchError lösen. Sie müssen es von operators wie: import { catchError } from 'rxjs/operators/catchError'; importieren. Im Allgemeinen müssen alle Operatoren auf diese Weise importiert werden, dasselbe gilt für observable wie observable/of.

import { catchError } from 'rxjs/operators/catchError'; 
import { map } from 'rxjs/operators/map'; 

all(): Observable<any> { 
    return this.http.get<any>('url') 
    .pipe(
     map(() => //do stuff), 
     catchError((error: Error) => { 
     // 
     }) 
    ) 
} 

Lesen Sie mehr über letable Operatoren here.

+2

Ihr Verständnis ist teilweise falsch. Es gibt tatsächlich eine mietbare Version des Catch-Operators catchError, aber das Original existiert immer noch. In demselben Blog, das Sie verlinkt haben, gibt es ein Beispiel, das den alten Patch-Ansatz ohne Probleme verwendet, und es entspricht der OP-Implementierung. Refactoring OPs Ansatz, um die neue Pipe-Methode zu verwenden, beantwortet nicht wirklich seine Frage. –

+0

Sie haben Recht. Ich schlug einen Weg vor, um es mit vermietbaren Operatoren zu lösen. – AndreaM16