可以观察到,我做得对吗?

时间:2016-05-19 18:21:22

标签: javascript typescript geolocation angular rxjs

我有这项服务:

 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; }

但遗憾的是它不起作用。我假设每次位置变化,纬度和长度都会改变。但它不起作用。

2 个答案:

答案 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);
        };
    });
}