2016-07-17 5 views
9

ich folgende Dienst haben, die fein gearbeitet, bis heute habe ich diesen Fehler bekamAngular2 Http mit RXJS beobachtbare Typeerror:.. This.http.get (...) Karte (...) Fang ist keine Funktion

Wenn ich diesen Code debuggen stürzt es ab, wenn es darum geht, Methode zu fangen.

import { Test } from "./home.component"; 
import { Injectable }  from "@angular/core"; 
import { Inject } from "@angular/core"; 
import { Http , Response } from "@angular/http"; 
import { Observable }  from "rxjs/Observable"; 

@Injectable() 
export class HomeService { 
    public constructor(@Inject(Http) private http: Http) {} 

    public getData(): Observable<Test []> { 
     return this.http.get("./src/app/home/home-data.json") 
      .map(this.extractData).catch(this.handleError); 
    } 

    public extractData(res: Response) { 
     let body = res.json(); 
     return body.data || { }; 
    } 

    public handleError (error: any) { 
     // In a real world app, we might use a remote logging infrastructure 
     // We"d also dig deeper into the error to get a better message 
     let errMsg = (error.message) ? error.message : 
      error.status ? `${error.status} - ${error.statusText}` : "Server error"; 
     console.error(errMsg); // log to console instead 
     return Observable.throw(errMsg); 
    } 
    } 

Antwort

20

Es scheint, dass der Fangoperator nicht importiert wird.

Sie könnten versuchen, es so zu importieren:

import 'rxjs/add/operator/catch' 

Oder allgemeiner dies, wenn Sie mehr Methoden für Observablen haben wollen:

import 'rxjs/Rx'; 

Sehen Sie diese Frage:

+0

Es hat funktioniert! Vielen Dank. Es ist verrückt, dass ich diesen "Import" -Rxjs/Rx in meiner Vendors-Datei habe, wo ich meine anderen Abhängigkeiten auch für angular2 importiere, aber ich glaube, dass ich diese Bibliothek in jede Datei importieren muss, wo ich diese oder hauptsächlich verwenden möchte. ts. –

+0

@Thierry, anscheinend das gesamte rxjs/Rx zu importieren ist keine gute Praxis. Denken Sie, dass es nicht so viel Verbesserung ist, nur die Operatoren zu importieren, die Sie brauchen? –

0

Ich hatte das gleiche Problem, aber in meinem Fall das Problem war, hatte ich Import Pflichtmodule mehrmals in Module.ts

0

Den 'O' Charakter in 'rxjs/O bservable' sein muss Großbuchstabe.

Die Angabe in Kleinbuchstaben 'o' gibt Ihnen diese und andere unheimliche Fehler. Dies muss wie folgt eingeführt werden:

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/catch'; 
import 'rxjs/add/observable/throw'; 

Es dauerte eine Stunde, um es zu finden. Beim Import werden die Namen in der Regel in Kleinbuchstaben geschrieben. Dies ist das erste Mal, dass ich das sehe. Ich hoffe, es wird den anderen helfen :)

Verwandte Themen