Массив Javascript, показывающий длину 0 при заполнении - PullRequest
0 голосов
/ 12 декабря 2010

Я уверен, что это действительно просто, но мне не повезло выяснить, что не так.Я создаю пустой массив (местоположения), заполняю его объектами местоположения в функции getPartnerLocations, а затем пытаюсь отобразить местоположения на карте с помощью функции drop.Проблема, с которой я столкнулся, заключается в том, что внутри функции drop массив локаций, в котором есть что-то, возвращает нулевую длину, поэтому цикл в не работает.Буду очень признателен за любые советы или идеи о том, что здесь происходит.

var markers = [];
var locations = [];
var iterator = 0;
var map;
var geocoder;
var newYork = new google.maps.LatLng(40.7143528, -74.0059731);


  function initialize() {
    var mapOptions = {
      zoom: 12,
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      center: newYork
    };

    map = new google.maps.Map(document.getElementById("map_canvas"),mapOptions);

  }

  function getPartnerLocations() {
      geocoder = new google.maps.Geocoder();    
      $('.partner').each(function(index){

            var street  = $('.partner-streetaddress',this).text();
            var city    = $('.partner-city',this).text();
            var state   = $('.partner-state',this).text();
            var country = $('.partner-country',this).text();

            var address = street + ', ' + city  + ', ' + state + ', ' + country;

            geocoder.geocode( { 'address': address}, function(results, status) 
            {

                if (status == google.maps.GeocoderStatus.OK) 
                {
                    locations.push( results[0].geometry.location ); 
                    console.log(locations[index]);
                }
                else
                {
                    console.log('failed to geocode address: ' + address);   
                }
            });

      });
      initialize();
      drop();
  }

  function addMarker() {
    console.log('add marker function');
    markers.push(new google.maps.Marker({
      position: locations[iterator],
      map: map,
      draggable: false,
      animation: google.maps.Animation.DROP
    }));
    iterator++;
  }

  function drop() 
  {
    console.log(locations.length);
    for (var i = 0; i < locations.length; i++) {
      setTimeout(function() {
        addMarker();
      }, i * 200);
    }
  }

 getPartnerLocations(); 

1 Ответ

2 голосов
/ 12 декабря 2010

geocode - асинхронная функция.

Обратный вызов не выполняется до некоторого времени после , когда вы звоните drop.
Следовательно, когда вы вызываете drop, массив все еще пуст.

Вам необходимо позвонить initialize и drop после ответа на последний вызов AJAX, в обратном вызове geocode.

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