如何更改Observable的订阅以响应用户操作?

时间:2017-01-25 23:07:34

标签: angular ionic-framework ionic2 rxjs

我正在为我的应用添加地理位置,我需要在用户实际请求该位置之前的某个时间启动可观察的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;
}

此外,订阅结束本身是否有一种不那么烦人的方式?

1 个答案:

答案 0 :(得分:1)

我的问题是缺乏理解。当然,观察者可以有多个订阅。

编辑:对不起!更多解释。

最后,我的工作解决方案是声明实例变量

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

ionic似乎非常适合在用户离开时实际调用willeave。如果没有调用,那么地理位置就会一直运行直到应用程序关闭,这很糟糕。我想以更具反应性的方式做到这一点,而不是强制性的方式......

编辑2:我确定这仍然不是最佳方式 - 如果您有任何建议,请告诉我们!