Как обеспечить использование «правильной» переменной в цикле с анонимными функциями? - PullRequest
1 голос
/ 17 марта 2011

Мы следовали Уроку Тома Энтони , чтобы вычислить геокод из британского почтового индекса и нанести маркер на карту Google.Это сработало нормально, но теперь мы хотим добавить всплывающее окно, когда вы нажимаете на местоположение.Поэтому мы обновили нашу функцию, чтобы поместить маркер и оригинальный код usePointFromPostcode для описания:

function usePointFromPostcode(postcode, description, callbackFunction) {

  localSearch.setSearchCompleteCallback(null, 
    function() {

      if (localSearch.results[0]) {    
        var resultLat = localSearch.results[0].lat;
        var resultLng = localSearch.results[0].lng;
        var point = new GLatLng(resultLat,resultLng);
        callbackFunction(point, description);
      }else{
        alert("Postcode not found!");
      }
    });  

  localSearch.execute(postcode + ", UK");
}
// loop through the array of postcodes to output markers
for(var i=0; i<postcodes; i++) {
    usePointFromPostcode(postcodes[i], descriptions[i], placeMarkerAtPoint);
}

Однако, хотя страница загружается без ошибок, все маркеры имеют одно и то же описание - то же, что и у последнего элемента.в массиве.Я считаю, что это связано с закрытием, а точнее с его отсутствием, но я не могу взломать решение.Как мы можем получить описания в синхронизации с точками?

1 Ответ

0 голосов
/ 20 марта 2011

Если localsearch.execute инициирует поиск, но возвращается до завершения поиска, это объясняет поведение.Два возможных решения.Создайте отдельный объект GlocalSearch для каждого запроса или задержите отправку второго запроса до тех пор, пока первый не будет завершен и т. Д.

Я недостаточно знаю о классе GlocalSearch, чтобы сказать, является ли первый разумным.Если это так, возможно, у вас будет несколько параллельных поисков, которые могут завершаться в произвольном порядке.

Чтобы сделать это позже: Измените свой обратный вызов, чтобы установить глобальный флаг done в true.Перед началом первого поиска установите done в false.После запуска первого поиска установите время ожидания.Код, выполняемый по таймауту, делает следующее: если done теперь истинно, он устанавливает done в значение false и инициирует второй поиск.В противном случае он просто повторяет тот же тайм-аут.И, конечно, подобные вещи повторяются до тех пор, пока не будут завершены все поиски, после чего код тайм-аута инициирует все, что вы хотите сделать после этого цикла.См. http://www.ehow.com/how_4847411_simulate-whilesleep-loop-javascript.html для краткой статьи, которая может быть полезна.

...