Bagian dari kode saya:
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()
menghasilkan pengecualian di konsol browser:
PENGECUALIAN ASLI: TypeError: this.http.request (...). Map (...). Catch bukan fungsi
throw()
fungsi. Saya menambahkan baris iniimport 'rxjs/Rx';
sebagai gantinya. Sekarang semua operator bekerja dengan baik..catch
benar - benar berfungsi? Itu.subscribe()
pasti berhasil.EXCEPTION: TypeError: Observable_1.Observable.throw is not a function
. Ini mungkin diperbaiki dengan jawaban @MattScarpino atau maner dari plunker ini seperti yang saya katakan di atas: angular.io/resources/live-examples/server-communication/ts/...import 'rxjs/add/observable/throw';
dan jangan impor semuanya, itu terlalu besar.Layanan baru diperbarui untuk menggunakan HttpClientModule dan RxJS v5.5.x :
Layanan lama, yang menggunakan HttpModule yang sudah usang:
Saya menggunakan
.do()
( sekarang.tap()
) untuk debugging.Ketika ada kesalahan server,
body
dariResponse
objek saya dapatkan dari server saya menggunakan (lite-server) hanya berisi teks, maka alasan saya menggunakanerr.text()
di atas bukanerr.json().error
. Anda mungkin perlu menyesuaikan jalur itu untuk server Anda.Jika
res.json()
memunculkan kesalahan karena tidak bisa mengurai data JSON,_serverError
tidak akan mendapatkanResponse
objek, maka alasan untukinstanceof
memeriksa.Dalam hal ini plunker, ubah
url
ke./data/data.junk
untuk menghasilkan kesalahan.Pengguna dari salah satu layanan harus memiliki kode yang dapat menangani kesalahan:
sumber
Ada beberapa cara untuk melakukan ini. Keduanya sangat sederhana. Masing-masing contoh berfungsi dengan baik. Anda dapat menyalinnya ke proyek Anda dan mengujinya.
Metode pertama lebih disukai, yang kedua agak ketinggalan jaman, tetapi sejauh ini berhasil juga.
1) Solusi 1
2) Solusi 2. Ini cara lama tetapi masih berfungsi.
sumber
Fungsi RxJS perlu diimpor secara khusus. Cara mudah untuk melakukan ini adalah dengan mengimpor semua fitur-fiturnya
import * as Rx from "rxjs/Rx"
Kemudian pastikan untuk mengakses
Observable
kelas sebagaiRx.Observable
.sumber
dalam versi terbaru penggunaan angular4
itu akan mengimpor semua hal yang diperlukan.
sumber