javascript - Observable, apakah saya melakukannya dengan benar?
Saya memiliki layanan ini:
getPosition(): Observable<Object> {
return Observable.create(observer => {
navigator.geolocation.watchPosition((pos: Position) => {
observer.next(pos);
observer.complete();
}),
() => {
console.log('Position is not available');
},
{
enableHighAccuracy: true
};
});
}
Saya ingin menggunakannya seperti ini:
this.getLocationService.getPosition().subscribe((pos: Position) => {
self._latitude = pos.coords.latitude;
self._longitude = pos.coords.longitude; }
Tapi sayangnya itu tidak berhasil. Saya mengira setiap kali posisi berubah, lintang dan bujur akan berubah. Tapi itu tidak berhasil.
Jawaban #1
Salah satu masalah di sini terkait dengan kontrak Observable
Kontrak yang Teramati
“Kontrak Observable,” yang mungkin Anda lihat dirujuk di berbagai tempat dalam dokumentasi sumber dan di halaman-halaman di situs ini, adalah upaya untuk definisi formal dari sebuah Observable, yang awalnya didasarkan pada dokumen 2010 Panduan Desain Rx dari Microsoft yang menjelaskan implementasi Rx.NET mereka dari ReactiveX. Halaman ini merangkum Kontrak Observable.
Notifikasi
An Observable communicates with its observers with the following notifications:
- OnNext
menyampaikan sebuah item yang dipancarkan oleh Observable kepada pengamat- OnCompleted
menunjukkan bahwa Observable telah selesai dengan sukses dan bahwa ia tidak akan memancarkan item lebih lanjut- ...
Jadi, jika Anda ingin terus memicu acara, Anda tidak boleh memanggil completed
getPosition(): Observable<Object> {
return Observable.create(observer => {
navigator.geolocation.watchPosition((pos: Position) => {
observer.next(pos);
// simply call next again, but not complete
// until position is completed
//observer.complete();
}),
...
Jawaban #2
Anda memiliki koma yang salah tempat, selain itu Anda harus menghentikan pengawas pada unsubscribe dan meneruskan kesalahan tersebut ke pengamat.
public $getDeviceLocation():Observable<Position> {
return Observable.create(observer => {
const onSuccess:PositionCallback = (pos:Position) => {
observer.next(pos);
};
const onError:PositionErrorCallback = (error) => {
observer.error(error);
};
const options:PositionOptions = this.locationOptions();
const watcher:number = navigator.geolocation.watchPosition(onSuccess, onError, options);
return () => {
navigator.geolocation.clearWatch(watcher);
};
});
}
