Геолокационные часыPostion стреляют каждую секунду - PullRequest
0 голосов
/ 14 января 2019

В моем приложении 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) {
      ...
   }
}

И когда мое устройство готово, я запускаю функцию watchPosition с помощью addListener:

Исходный звонок был такой: 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. Какой идеальный тайм-аут для продолжения вызова этой функции ... нормально ли каждую секунду, слишком ли много нагрузки / обработки, быстрее ли разряжаются батареи и т. Д.?

1 Ответ

0 голосов
/ 14 января 2019

Используемые timeout и maximumAge не определяют, как часто вы получаете ответ из браузера. Вот что MDN говорит об этих свойствах:

PositionOptions.timeout Это положительное длинное значение, представляющее максимальный промежуток времени (в миллисекундах), который разрешено принимать устройству для возврата позиции.

PositionOptions.maximumAge Это положительное длинное значение, указывающее максимальный возраст в миллисекундах возможной позиции в кэше, которую можно вернуть.

источник

Я бы посоветовал вам сохранить значение из обратного вызова в переменной, а пользователю - еще один setInterval, чтобы вернуть значение со скоростью, которую вы можете определить.

EDIT

Если вы хотите обработать скорость ответа, вы можете использовать функцию getCurrentPosition, которая вызовет обратный вызов только один раз ( source )

...