Parte do meu 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()
produz exceção no console do navegador:
EXCEÇÃO ORIGINAL: TypeError: this.http.request (...). Map (...). Catch não é uma função
throw()
função. Eu adicionei esta linhaimport 'rxjs/Rx';
em seu lugar. Agora todos os operadores funcionam corretamente..catch
realmente funciona? Isso.subscribe()
funciona com certeza.EXCEPTION: TypeError: Observable_1.Observable.throw is not a function
. Ele pode ser corrigido com a resposta @MattScarpino ou de maneira mais manerosa a partir deste plunker, como eu disse acima: angular.io/resources/live-examples/server-communication/ts/…import 'rxjs/add/observable/throw';
e não importe tudo, é muito grande.Novo serviço atualizado para usar o HttpClientModule e o RxJS v5.5.x :
Serviço antigo, que usa o HttpModule descontinuado:
eu uso
.do()
( agora.tap()
) para depuração.Quando há um erro no servidor, o
body
doResponse
objeto que eu começar a partir do servidor que estou usando (lite-server) contém apenas texto, daí a razão de eu usarerr.text()
acima em vez deerr.json().error
. Pode ser necessário ajustar essa linha para o seu servidor.Se
res.json()
gera um erro porque não pôde analisar os dados JSON,_serverError
não obterá umResponse
objeto, daí o motivo dainstanceof
verificação.Neste plunker, mudar
url
para./data/data.junk
para gerar um erro.Os usuários de qualquer serviço devem ter um código que possa lidar com o erro:
fonte
Existem várias maneiras de fazer isso. Ambos são muito simples. Cada um dos exemplos funciona muito bem. Você pode copiá-lo em seu projeto e testá-lo.
O primeiro método é preferível, o segundo está um pouco desatualizado, mas até agora funciona também.
1) Solução 1
2) Solução 2. É antigo, mas ainda funciona.
fonte
As funções RxJS precisam ser importadas especificamente. Uma maneira fácil de fazer isso é importar todos os seus recursos com
import * as Rx from "rxjs/Rx"
Então, certifique-se de acessar a
Observable
classe comoRx.Observable
.fonte
na versão mais recente do angular4 use
ele importará todas as coisas necessárias.
fonte