Избегайте setTimeout в функции обратного вызова ajax - PullRequest
1 голос
/ 30 ноября 2010

Есть ли другой способ сделать это, который может помешать setTimeout быть необходимым?

function initialize(){

   $.get('test.xml', function(xml){

      //do some stuff with xml like...
      var icons = xml.documentElement.getElementsByTagName("icon");
        for(var i = 0; i < icons.length; i++) {
           var iconImage = icons[i].getAttribute("image"),
        }

      //do more things to create markers like...
      markers.push(marker);

      //try to add markers to map
      //this will give an error
      addMarkers(markers);

      //setTimeout makes it work
      setTimeout("addMarkers(markers)", 300);

      //is there any way to avoid the timeout?
   });

}

1 Ответ

2 голосов
/ 30 ноября 2010

Трудно сказать, что не так, поскольку вы не предоставляете полученную ошибку или код, который создает маркер. Попытка угадать, что, скорее всего, происходит, что код, который вы запускаете для создания маркеров и, возможно, для инициализации карты, выполняется не синхронно, а асинхронно. Это определенно будет иметь место, если есть некоторые вызовы ajax, и это означает, что система map / manager не готова к моменту вызова последней строки javascript, но через некоторый период времени и, конечно, после выхода из функции .

Чтобы избежать setTimeout, который, помимо прочего, привнесет ненужную задержку и его очень легко сломать, если в определенных условиях требуется больше времени, вам нужно взглянуть на код, который создает маркеры, и посмотреть, есть ли определен обратный вызов / событие, которое отмечает завершение процедуры инициализации.

...