Проблемы с возвратом значения из navigator.функция геолокации, привязанная к событию формы

#jquery #geolocation

#jquery #геолокация

Вопрос:

У меня есть обработчик событий, привязанный к переключателю формы

 $("#formSwitch").on('change', function() {

var geoOptions = {
    maximumAge: 5 * 60 * 1000,
    }

var geoSuccess = function(position) {

      /***** do some stuff here ****/
      return ( true );

      };

var geoError = function(error) {

   /***** do some stuff here ****/
   return ( false );

   };

var status = navigator.geolocation.getCurrentPosition(geoSuccess, geoError, geoOptions);

console.log(status); /******** Geolocation works but gives undefined here ******/

return(status);                         

});
  

И я хочу как активировать переключатель, так и определить статус геолокации, поэтому я попытался:

  if( !$("#formSwitch").val("on").change() ) {

    /****** geoLocation is false so do some stuff here ******/

    }
  

Это запускает переключатель, вызывает функцию геолокации нормально, но не получает возвращаемое значение.

Ответ №1:

Возможно, вам следует проверить, поддерживает ли браузер геолокацию: if (navigator.geolocation !== undefined){/* do geolocation stuff here */}

Некоторые браузеры начали блокировать геолокацию при определенных условиях при разработке loca, и, возможно, в вашем браузере происходит сбой: https://developers.google.com/web/updates/2016/04/geolocation-on-secure-contexts-only#does_this_affect_local_development

Кроме того, поскольку обратные вызовы геолокации являются асинхронными, возможно, было бы лучше размещать журналы консоли внутри обратных вызовов geoSuccess и geoError. Возможно, что консоль.журнал оценивается до того, как getCurrentPosition вернет что-либо.

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

 var geoOptions = {
    maximumAge: 5 * 60 * 1000,
    }

var geoSuccess = function(position) {

      /***** do some stuff here ****/
      console.log(true);

      };

var geoError = function(error) {

   /***** do some stuff here ****/
   console.log(false);

   };

var status = navigator.geolocation.getCurrentPosition(geoSuccess, geoError, geoOptions);  

Комментарии:

1. Нет navigator.geolocation возвращает true.

2. И geoSuccess и geoError передаются как функции обратного вызова, чтобы гарантировать, что они выполняются после завершения запроса.

3. Верно, но ваш код продолжает выполняться после вызова getCurrentPosition . Он не ожидает разрешения обратных вызовов, прежде чем перейти к следующей строке кода, поэтому статус не определен, пока не разрешится один из обратных вызовов. Вот почему консоль. журнал не определен.