我正在为我的应用添加地理位置,我需要在用户实际请求该位置之前的某个时间启动可观察的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;
}
此外,订阅结束本身是否有一种不那么烦人的方式?
答案 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:我确定这仍然不是最佳方式 - 如果您有任何建议,请告诉我们!