Неправильные значения родительских переменных JavaScript? - PullRequest
2 голосов
/ 26 ноября 2008

У меня есть следующий код:

var address;
getAddress(0,0);
function getAddress(latlng) 
{
  if (latlng != null) 
  {
    geocoder.getLocations(latlng, 
    function(addresses) 
    {
      if(addresses.Status.code == 200) 
      { 
        address = addresses.Placemark[0].address.toString();
        alert(address);  // Outputs something :)
      }
    });
   }
   return address;   //returns nothing :(
}

address всегда возвращает undefined, но предупреждение что-то выводит. Почему это?

(Геокодер является экземпляром API Карт Google )

Ответы [ 4 ]

3 голосов
/ 26 ноября 2008

Я думаю, что все ваши проблемы связаны с областью применения. Вообще говоря, вы не хотите полагаться на глобальное объявление переменной, которая будет использоваться в рамках функции.

Это должно исправить любые проблемы с областью действия вашей функции:

var address = getAddress(0,0);

function getAddress(latlng) {
    if (latlng != null) {
        var address = geocoder.getLocations(latlng, function(addresses) {
            if(addresses.Status.code == 200) { 
                return addresses.Placemark[0].address.toString();
            }
        });
    }
return address;
}
0 голосов
/ 26 ноября 2008

Я успешно воспроизвел ошибку, реализовав geocoder.getLocations (), чтобы он был асинхронным. Если geocoder.getLocations () просто выполнил функцию параметра, то изменение переменной станет видимым до того, как getAddress () вернется, так что это не проблема области действия.

var address;
alert("B: address returned: " + getAddress());
function getAddress() {
  executeFunction(function() {
    address = "myAddress";
    alert("C: address set to: " + address);
  });
  return address;
}

function executeFunction(aFunction) {
  alert("A: executing: " + aFunction);
  window.setTimeout(aFunction, 1);
}

Выполнение приведенного выше кода приводит к порядку предупреждений A-B-C, означающему, что адрес возвращается до его назначения. Замена window.setTimeout(aFunction, 1); на aFunction() приводит к порядку A-C-B с последним предупреждением «B: адрес возвращен: myAddress».

0 голосов
/ 26 ноября 2008

Если я не ошибаюсь, это выглядит как

geocoder.getLocations

не вернет значение, но ожидает функцию обратного вызова, в вашем случае:

function(addresses) {
    if(addresses.Status.code == 200) { 
        return addresses.Placemark[0].address.toString();
    }
}

Это «внутреннее» возвращение мало что даст, так как будет возвращаться к внутренностям geocoder.getLocations.

Таким образом, функция, выполняющая присваивание, вероятно, вызывается позже, чем внешний возврат (обратный вызов и состояние 200 предполагают, что задействован медленный http-вызов).

То есть, если вы не можете изменить geocoder.getLocations, решением будет сделать вашу функцию тоже функциональной, что-то вроде:

function getAddress(latlng, callback) {
    if (latlng != null) {
        geocoder.getLocations(latlng, function(addresses){
            if(addresses.Status.code == 200) { 
                address = addresses.Placemark[0].address.toString();
                alert(address);
                //Outputs something :)
                callback(address);
            }
        });
    }

}

и вы назовете это что-то вроде:

getAddress(ll, function(address){
   alert(address);
});

И в качестве бонуса вы можете избавиться от глобальной переменной: -)

0 голосов
/ 26 ноября 2008

Я не вижу причин, почему это не сработает.

Чтобы быть вдвойне уверенным, что ничто не возвращает ничего, вызовите функцию, подобную этой

window.alert(getAddress(0,0));

А затем посмотрите, что выводится

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...