0

Здравствуйте! Проблема следующая, имеется код:

var globalVar = "a";

function add() { for (i = 0; i < path.length; i++) {..... //Здесь в качестве параметра передается функция aw
geocoder.geocode({ 'latLng': latlng }, aw); //Пробую выводит новое значение переменной globalVar, а выводится старое alert(globalVar);... } }

function aw(results, status) { if (status == google.maps.GeocoderStatus.OK) { if (results[1]) { ... if (...) { globalVar = "qqqq"; alert(globalVar) } else { globalVar = "aaaa"; alert(globalVar) } } }

В ф-ции aw переменная меняет, проверено выводом alert. А как потом это измененное значение получить в основной функции, род комментарием: //Пробую выводит новое значение переменной globalVar, а выводится старое

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
zesen
  • 654
  • 1
  • 5
  • 20
  • мне кажется у вас какое то из условий в функции aw не срабатывает.. потому что если убрать из вашего кода все условия, то всё работает: http://jsfiddle.net/jPUJT/ – Яковлев Андрей Dec 19 '12 at 17:44
  • 4
    .geocode() - асинхронная функция, поэтому колбэк aw может вызваться после вызова alert(globalVar); – Spectre Dec 19 '12 at 18:11
  • @Spectre: превратите в ответ? Типичный race, кстати :) – VladD Dec 19 '12 at 19:23

1 Answers1

3

Попробуйте изменить вашу фунцию следующим образом:

function aw(results, status) {
    alert('Start AW-function');
    if (status == google.maps.GeocoderStatus.OK) {

И:

  //Пробую выводит новое значение переменной globalVar, а выводится старое
  alert('in main:' + globalVar);

Тогда вы увидите, что у вас сначала выдается "in main", а потом уже запускается функция.

Так работает механизм "многопоточности" JS-машины. В общем виде, так и должно быть - вы увидите измененное значение globalVar только тогда, когда/если оно реально изменится...

Колбек - это реакция на событие. То есть если вы написали а = с + 1;, то это будет вычислено, как только "комп" доберется до этой строчки кода. Колбек же будет выполнен только после какого-то события (строго говоря он может не быть вызван никогда).

Если вам нужно что-то по поводу изменения значения делать - добавьте вызов обработчика в колбек... Ну или на таймер повесьте в конце-концов...

SilverIce
  • 4,922