2012-05-31 5 views
0

Я закодировал эту функцию для обнаружения и обновления переменных postLat и postLon.Локальная переменная Javascript не обновляется

function searchAddSubmit(){ 
    var shopId = 1; //random number to test the function 
    var postLon, postLat; 
    var shopTime = $("#selected-search-result-minutes").val(); 
    navigator.geolocation.getCurrentPosition(function(position){ 
     postLat=position.coords.latitude; 
     postLon=position.coords.longitude; 
     console.log(postLat); 
     console.log(postLon); 
     console.log('reun'); 
    },function(error){}); 
    console.log(postLat+" 1231"); 
    console.log(postLon+" 1231"); 
    $.ajax({ 
     type: "POST", 
     url: "search-add-process.php", 
     cache: false, 
     dataType: "json", 
     data:{ 
      id: shopId, 
      time: shopTime, //this value is taken from a form input 
      lat: postLat, 
      lon: postLon 
     }, 
     success: function (data) { 
      if(data.error === true) { 
       alert(data.msg); 
      } else { 
       alert(data.msg); 
       //remove output when successful 
      } 
     } 
    }); 
} 

Я использовал инструмент Javascript консоли Chrome, чтобы исследовать переменные (как напечатано с console.log()), и это результат:

undefined 1231 
undefined 1235 
1.2957797 
103.8501069 
ruen 

Далее в этот момент, у меня есть следующие вопросы:

  1. Почему переменные postLon и postLat не обновлены? На самом деле неопределенные переменные передаются в search-add-process.php в блоке ajax, а не в фактических значениях.
  2. Почему navigator.geolocation.getCurrentPosition() функция работает после console.log(postLat+" 1231") линия? Исправьте меня, если я ошибаюсь, я всегда предполагал, что Javascript будет выполняться по строкам.
+0

Является ли 'getCurrentPosition()' вызовом AJAX? Функция обратного вызова, которую вы предоставили в нее, может запускаться после вызова 'console.log()'. – Blender

+0

@Blender, 'getCurrentPosition()' принадлежит API геолокации, новый в HTML5. –

+0

@Blender, вы можете посмотреть API геолокации в [Mozilla] (https://developer.mozilla.org/en/Using_geolocation). :) –

ответ

1

Сначала вы указываете API геолокации, чтобы попытаться найти текущую позицию пользователя, и вы отпустите его и выполните поиск, пока выполняете остальную работу. Это называется Асинхронное выполнение. Другими словами, вы даете Geolocation API найти свое время для поиска и поиска места пользователя, в то время как остальная часть вашей работы (остальная часть вашего кода выполняется). Затем, когда API нашел позицию, он выполняет функцию, которую вы передали ей.

Возьмите код ajax в обратном вызове , и все будет хорошо.

+0

Но что, если латлон не может быть восстановлен, не будут ли выполняться коды ajax? 'postLat' и' postLon' предназначены для отслеживания местоположения пользователя, когда они вводят время магазина (он предназначен для отслеживания неполных таймеров, когда они находятся на земле). –

0

Поместить весь $.ajax({...}); вызов в функции обратного вызова getCurrentPosition; , например. разместить его непосредственно до или после строки console.log('reun');