2013-06-20 7 views
0

Я пытаюсь сделать мои оверлеи более медленными, а не одновременно. Код работает отлично, пока я не добавлю setTimeout. Когда я пытаюсь запустить его, консоль говорит, что latLng не определен.комплектTimeout не работает. Консоль говорит, что latLng не определен

После поиска я вижу, что у многих людей были подобные проблемы, но ни один из них, похоже, не ответил на мой вопрос.

Вот эта функция. Дайте мне знать, если вам нужно больше кода.

function getAndDrop() { 
    $.ajax({ 
     url : 'php/locationarray.php', 
     success : function(data) { 
      latLng = data.split(" "); 

      for (i = 0; i < latLng.length; i++) { 
       setTimeout(function(){ 
       var loc = latLng[i].split("|"); 
       if (marker.length > maxOverlays) 
        clearSingleOverlay(); 
       addMarker(loc[0], loc[1]); 
       }, i*200); 
      } 
     } 
    }); 
} 

Редактировать: latLng определяется как глобальное выше. Это было местное. Я сделал это глобальным в попытке отладки

+0

@IvanL latLng содержит пробелы, разделенные координатами. Я не думаю, что это может быть проблемой, потому что она отлично работала без setTimeout(). Когда setTimeout() удаляется, он функционирует так, как я ожидал. Он опускает все наложения так быстро, что кажется, что все они появляются одновременно. – user2465313

ответ

5

Вам нужно закрыть:

success : function(data) { 
    var latLng = data.split(" "); 

    for (i = 0; i < latLng.length; i++) { 
     (function(LL){ 


      setTimeout(function(){ 
      var loc = LL.split("|"); 
      if (marker.length > maxOverlays) 
       clearSingleOverlay(); 
       addMarker(loc[0], loc[1]); 
      }, i*200); 


     })(latLng[i]); 

    } 
} 

читать здесь для уточнения: Please explain the use of JavaScript closures in loops

пс. вы должны создать специальную функцию для обработки обработки в цикле:

т.е.: для (...) handleCurrent();

-1

Это потому, что latLng не доступен в закрытии. Не могли бы вы попробовать добавить var до latLng декларации:

success : function(data) { 
    var latLng = data.split(" "); 

    for (i = 0; i < latLng.length; i++) { 
     setTimeout(function(){ 
     var loc = latLng[i].split("|"); 
     if (marker.length > maxOverlays) 
      clearSingleOverlay(); 
     addMarker(loc[0], loc[1]); 
     }, i*200); 
    } 
} 
+0

Так оно и было. Я сделал это глобальным в попытке отладки – user2465313

+0

> latLng недоступен в закрытии. Не так ли? Определить переменную без ключевого слова 'var', просто определяет ее в контексте окна (т. Е. Глобальном). Если вы не используете строгий режим. – Tommi

Смежные вопросы