Parte de mi código:
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()
produce una excepción en la consola del navegador:
EXCEPCIÓN ORIGINAL: TypeError: this.http.request (...). Map (...). Catch no es una función
throw()
función. Agregué esta línea en suimport 'rxjs/Rx';
lugar. Ahora todos los operadores funcionan correctamente..catch
realmente funciona? Eso.subscribe()
funciona seguro.EXCEPTION: TypeError: Observable_1.Observable.throw is not a function
. Puede corregirse con la respuesta @MattScarpino o en este caso desde el plunker como dije anteriormente: angular.io/resources/live-examples/server-communication/ts/…import 'rxjs/add/observable/throw';
y no importes todo, es demasiado grande.Nuevo servicio actualizado para usar HttpClientModule y RxJS v5.5.x :
Servicio anterior, que utiliza el HttpModule en desuso:
Yo uso
.do()
( ahora.tap()
) para la depuración.Cuando hay un error de servidor, el
body
delResponse
objeto consigo desde el servidor que estoy usando (lite-servidor) contiene sólo texto, de ahí la razón por la que utilizoerr.text()
anteriormente en lugar deerr.json().error
. Es posible que deba ajustar esa línea para su servidor.Si
res.json()
genera un error porque no pudo analizar los datos JSON,_serverError
no obtendrá unResponse
objeto, de ahí el motivo de lainstanceof
verificación.En esto plunker, cambie
url
a./data/data.junk
para generar un error.Los usuarios de cualquiera de los servicios deben tener un código que pueda manejar el error:
fuente
Hay varias formas de hacer esto. Ambos son muy simples. Cada uno de los ejemplos funciona muy bien. Puede copiarlo en su proyecto y probarlo.
El primer método es preferible, el segundo está un poco desactualizado, pero hasta ahora también funciona.
1) Solución 1
2) Solución 2. Es antigua, pero aún funciona.
fuente
Las funciones RxJS deben importarse específicamente. Una manera fácil de hacer esto es importar todas sus características con
import * as Rx from "rxjs/Rx"
Luego, asegúrese de acceder a la
Observable
clase comoRx.Observable
.fuente
en la última versión de uso angular4
importará todas las cosas requeridas.
fuente