【问题标题】:Geolocation watchPostion firing every second地理位置 watchPostion 每秒触发一次
【发布时间】:2019-06-08 13:02:07
【问题描述】:

在我的 Ionic 应用程序中,我使用以下选项实现了地理位置 watchPosition。我的选项设置为每 10 秒触发一次,但它每秒触发一次。它通常每秒触发两次。

function watchPosition() {
   var options = {
      maximumAge: 10000,
      timeout: 10000,
      enableHighAccuracy: true,
   }
   watchID = navigator.geolocation.watchPosition(onSuccess, onError, options);

   function onSuccess(pos) {
      ...
   }
   function onError(error) {
      ...
   }
}

当我的设备准备就绪时,我使用 addListener 触发 watchPosition 函数:

原来的调用是这样的: var watchID = null ; document.addEventListener("deviceready", watchPosition);

然后我改为: document.addEventListener("deviceready",setupWatch) ;

function setupWatch() {
    // global var here so it can be cleared on logout (or whenever).
    activeWatch = setInterval(watchPosition, 5000);
}

而且它还在每秒发射一次。

然后我简单地将addEventListener 替换为,我意识到eventListener 已经在Ionics $ionicPlatform.ready() { .. } 内部,因此不需要eventListener。但是,现在调用它会触发 watchPosition 每秒 5 次,而不是每 5 秒一次。:

setupWatch() ;

关于 watchPosition 最佳做法的其他问题。继续调用此函数的理想超时是多少……每秒都可以吗,负载/处理是否过多,是否会更快耗尽电池等?

【问题讨论】:

标签: javascript html cordova ionic-framework geolocation


【解决方案1】:

我会很惊讶你连续的纬度/经度读数是相同的。也许“准确度”仪表有所不同,或者一个来源是 GPS 和另一个电信塔。室外还是室内?

不管我推荐filtering 读数是否适合您的应用程序。恕我直言,忽略不准确或无趣的读数是所有 GPS 应用程序都必须满足的要求。

【讨论】:

    【解决方案2】:

    在我的代码中,watchPosition 连续触发了两次,但 getCurrentPostion 出于显而易见的原因总是只触发一次。

    解决方案 1 是使用 getCurrentPosition,然后设置一个计时器以在 X 毫秒后重新检查该位置并根据需要进行更新。

    解决方案 2(出于各种其他原因,我使用过)将使用 watchPosition,但让回调仔细检查 long/lat 是否实际发生了变化。如果不是,则忽略该功能的其余部分。举个例子:

    var oldlong = "";
    var oldlat = "";
    
    navigator.geolocation.watchPosition(onGpsChangeSuccess,onGpsError,{
       maximumAge: 10000, 
       enableHighAccuracy: false, 
       timeout: 15000 
     }
    );
    
    var onGpsChangeSuccess = function(){
        //Watch was triggered...
    
        if(oldlong != position.coords.longitude && oldlat!=position.coords.longitude){
    
            //Changes detected
            oldlong = position.coords.longitude;
            oldlat = position.coords.latitude; 
            performTheRestOfYourFunctionHere
    
       }else{
           //No changes detected
       }
    }
    

    我们不应该执行这个额外的检查,但如果观察者有错误,那么最好是安全的。

    【讨论】:

      【解决方案3】:

      您使用的timeoutmaximumAge 并未定义您从浏览器获得答案的频率。以下是 MDN 对这些属性的评价:

      PositionOptions.timeout 是一个正长值,表示允许设备返回位置的最大时间长度(以毫秒为单位)。

      PositionOptions.maximumAge 是一个正长值,表示可接受返回的可能缓存位置的最大年龄(以毫秒为单位)。

      source

      我建议您将回调中的值存储在一个变量中,并使用另一个 setInterval 以您可以定义的速率返回该值。

      编辑

      如果你想处理应答率,你可以使用函数getCurrentPosition,它只会触发一次回调(source

      【讨论】:

      • 我想我误解了这些值是什么。我认为timeout 是函数再次重复的时间间隔。我现在将 watchPosition 函数包装在 setInterval 中。
      • 我添加了 setInterval(更新了我上面的代码),现在它每秒调用 5 次。
      • 我认为您最好只呼叫一次watchPosition,就像您在开始时所做的那样。你想如何使用结果?
      • 我刚刚更新了我的答案,您可以简单地将navigator.geolocation.watchPosition 更改为navigator.geolocation.getCurrentPosition,它应该会更好;)
      猜你喜欢
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多