2013-07-09 3 views
0

Я пытаюсь получить адрес, соответствующий требованиям к широте, долготе в переменной (в javascript). Я создал функцию обратного вызова (после прочтения на нем многочисленных сообщений), а код выглядит следующим образом. Теперь я хочу сохранить адрес в переменной под названием location3.google maps обратное геокодирование: передача переменных

Как ни странно, для предупреждения сразу после назначения местоположения3 оно не определено. Но если смотреть на 300 мс позже, тогда это дает правильное значение. Я хочу немедленно получить адрес, назначенный для location3. Любые предложения приветствуются.

function codeLatLng1(lat,long,callback) { 
    var geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(lat,long); 
    if (geocoder) { 
    geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     if (results[1]) { 
      callback(results[1].formatted_address); 
      myvariable=results[1].formatted_address; 
     } else { 
      alert("No results found"); 
     } 
     } else { 
     alert("Geocoder failed due to: " + status); 
     } 
    }); 
    } 
} 


lat1_last=37;long1_last=-100; 
codeLatLng1(lat1_last,long1_last,function(locat) {location3=locat;}); 
alert (location3); // THIS ALERT SHOWS THAT IT IS STILL UNDEFINED 
setTimeout(function(){alert (location3);},300); // THIS ALERT GIVES THE RIGHT ADDRESS 

ответ

0

Идея понять здесь является то, что второй аргумент геокодировать(), функция обратного вызова, не будет называться сразу, а только после того, как результат получен от Google. Между тем, функция codeLatLng1(), отправив запрос, возвращает управление вызывающему. В вашей программе это означает, что первое предупреждение() происходит дальше, а затем некоторое время ожидания, в течение которого Google возвращается к вам, вызывается обратный вызов и так далее.

Аналогично, ваш анонимный обратный вызов, который устанавливает location3, выполняется только тогда, когда этот результат получен - не до возврата кодаLatLng1.

Было бы разумнее поставить предупреждение в ваш анонимный обратный вызов. Обычно это результат окончательной обработки результата.

Это пример асинхронного или управляемого событиями программирования.

Надеюсь, это поможет!

+0

Привет, Эрик, Большое спасибо за ваше предложение. Да, предупреждение хорошо работает внутри обратного вызова без необходимости задержки, как вы предложили. Однако моя цель - использовать значение переменной «Location3» в инфобоксах (мне действительно не нужно оповещение) - как я могу назначить обратный геокодированный адрес непосредственно на «Location3» без необходимости задержки. Еще раз спасибо. – user2363675

+0

Вы можете создать инфобокс внутри обратного вызова. Это хороший стиль программирования. Если вы должны создать его раньше, оставьте его невидимым, а затем пусть обратный вызов установит ярлык и сделает его видимым. –

+0

Всегда будет задержка - вы получаете доступ к Интернету! Вы найдете его намного проще, если поместить большую часть своего кода в обратные вызовы. Тем не менее, это больше проблем, чем того стоит, но если вы хотите подождать, пока не будет определено location3, вам понадобится цикл, который проверяет, все ли он по-прежнему не определен так часто ... –

Смежные вопросы