2016-05-19 2 views
2

У меня есть этот сервис:Наблюдаемый, я делаю это правильно?

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

watchPosition должен получить новую позицию и обновить наблюдаемую –

ответ

5

Одна проблема здесь связана с наблюдаемыми контракта

The Observable Contract

«Наблюдаемая Contract», который вы можете увидеть ссылочного в различных местах в исходной документации и на страницах данного сайта, является попытка формального определения Observable, основанная на изначально в документе Rx Design Guidelines 2010 от Microsoft , в котором описана реализация Rx.NET ReactiveX. На этой странице представлен Договор о наблюдении.

Уведомления

An Observable communicates with its observers with the following notifications: 
  • OnNext
    передает элемент, который испускается Наблюдаемые наблюдателю
  • OnCompleted
    указывает, что Наблюдаемые успешно завершен и , что он будет не испускать никаких дополнительных предметов
  • ...

Итак, если вы хотите продолжать стрелять события, вы должны не называйте завершения

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(); 
     }), 
     ... 
+0

я предполагаю, что каждый раз, когда положение меняется, тем observer.next (Pos) будет вызван с новой позиция получила от geolocation.watchPosition. Я здесь не прав? –

+0

Было бы правдой, если вы не остановитесь после первого триггера, вызвав полный ..., который будет (по контракту) означать, что нет другого СЛЕДУЮЩЕГО ожидаемого .. перестаньте наблюдать ... это помогает? –

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); 
     }; 
    }); 
} 
Смежные вопросы