2017-01-25 2 views
0

Я добавляю геолокацию в свое приложение, и мне нужно запустить наблюдаемый Geolocation.watchPostion() некоторое время, прежде чем пользователь действительно запросит местоположение.Как изменить подписку на Наблюдение в ответ на действие пользователя?

у меня была идея создать переменные экземпляра

private locationObserver = (stub observer); 
private locationSubscription; 

и сделать

this.locationSubscription = Geolocation.watchPosition().subscribe(
    next => this.locationObserver.next(next), 
    err => this.locationObserver.error(error), 
    comp => this.locationObserver.complete(complete) 
) 

А потом в какой-то позже вызвать следующее.

onRequestLocation(){ 
    this.locationObserver = Observer.create(
    location => { 
     this.doMyStuff(location); 
     this.locationSubscription.unsubscribe(); 
    } 
) 
} 

Однако, это не похоже на правильный способ сделать это. Это плохо?

Моя цель - начать Geolocation.watchPosition(), а затем, в ответ на пользовательское событие, начните что-то делать. Я также хотел бы, чтобы событие тайм-аута произошло 5 секунд после пользовательского события.

Вот еще одна возможность, которая до сих пор не чувствует себя хорошо:

Я делаю переменные экземпляра

private userEventHasOccured 
private locationSubscription 

и сделать

this.locationSubscription = Geolocation.watchPosition().subscribe(
    next => { 
    if (userEventHasOccured) { 
     this.doMyStuff(next); 
     this.unsubscribeLocation(); 
    } 
    } 
) 

public unsubscribeLocation() { 
    this.locationSubscription.unsubscribe(); 
} 

и

onUserEvent(){ 
    this.userEventHasOccured = true; 
} 

Кроме того, это e менее раздражающий способ иметь сам абонемент?

ответ

1

Моя проблема заключалась в недостатке понимания. Конечно, наблюдаемый может иметь более одной подписки.

Редактировать: Sorry! Еще несколько объяснений.

В конце концов, мой рабочий раствор, чтобы объявить переменные экземпляра

this.stubSubscription 
this.actualSubscription 

, а затем вызвать следующие на странице загрузки, действия пользователя и отпуска страницы соответственно.

ionViewDidEnter() { 
    this.stubSubscription = Geolocation.watchPosition() 
    .subscribe(() => {},() => {}); 

onUserAction() { 
    this.actualSubscription = Geolocation.watchPosition() 
    .first(position => position.coords.accuracy <= 50) // 1st accurate-enough result 
    .subscribe(position => this.doMyStuff(position)) 

ionViewWillLeave() { 
    this.stubSubscription.unsubscribe(); 
    this.actualSubscription.unsubscribe(); 
} 

ионная, кажется, очень хорошо о фактически вызова willeave всякий раз, когда пользователь покидает. если не вызывать, то геолокация просто продолжает работать, пока приложение не будет закрыто, что плохо. Я хотел бы сделать это в более реактивном, а не императивном порядке ...

Редактировать 2: Я уверен, что это пока не лучший способ сделать это - если у вас есть какие-либо предложения, пожалуйста дай мне знать!

+0

Просьба либо разработать рабочий раствор (код). Этот текущий ответ на самом деле не дает достаточной информации. Благодаря! :) – Alex

+0

Конечно. Мое решение в конечном итоге заключалось в создании _two_ подписки на одно и то же наблюдаемое - одно, чтобы «запустить» его, а другое - в ответ на ввод пользователя, а затем отменить их обоих, чтобы «остановить» наблюдаемое. –

+0

Выглядит лучше! Вы получаете +1 за это;) – Alex