我有这项服务:
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
};
});
}
我想这样用:
this.getLocationService.getPosition().subscribe((pos: Position) => {
self._latitude = pos.coords.latitude;
self._longitude = pos.coords.longitude; }
但遗憾的是它不起作用。我假设每次位置变化,纬度和长度都会改变。但它不起作用。
答案 0 :(得分:7)
此处的一个问题与Observable合约
有关The Observable Contract
“可观察合同”,您可能会在源文档和本网站页面的不同位置看到, 是一种基于Observable的正式定义的尝试 最初来自Microsoft的2010年文档Rx设计指南 它描述了它的ReactiveX的Rx.NET实现。 本页概述了可观察合同。
通知
An Observable communicates with its observers with the following notifications:
- OnNext
传达Observable向观察者发射的物品- 的 OnCompleted 强>
表示Observable已成功完成并且 它将不再散发物品- ...
因此,如果您想继续触发事件,则不应调用已完成的
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();
}),
...
答案 1 :(得分:0)
你有一个错位的逗号,而且你应该在取消订阅时停止观察者并将错误转发给观察者。
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);
};
});
}