2012-05-24 3 views
1

Можно создать дубликат:
setTimeout in a for-loop and pass i as valueSetTimeout в цикл не работает

я пытаюсь генерировать динамический массив и использовать этот массив в качестве петли .. но в цикле SetTime из не работает или функция не работает. Вот мой код

jQuery(document).ready(function() { 
    temp = new Array(); 
    generateArray(temp); 

    function generateArray(temp) { 
     if (temp.length < 10) { 
      res = randomXToY(1, 10, 0); 
      for (var k = 0; k < temp.length; k++) { 
       if (temp[k] == res) { 
        var test = 1; 
       } 
      } 
      if (test != 1) { 
       temp.push(res); 
       //abc(temp); 
      } 
      generateArray(temp); 
     } else { 
      for (var z = 0; z < 10; z++) { 
       tnest(temp[z]); 
       setTimeout(function() { 
        removeClassImg(temp[z]) 
       }, 3000); 
      } 
      temp = new Array(); 
      generateArray(temp); 
     } 
    } 

    function removeClassImg(result1) { 
     alert(result1); 
     $('#img' + result1).fadeTo(12000, 0.1); 
     return true; 
    } 

    function tnest(result) { 
     alert(result); 
     $('#img' + result).fadeTo(12000, 1); 
     return true; 
    } 

    function randomXToY(minVal, maxVal, floatVal) { 
     var randVal = minVal + (Math.random() * (maxVal - minVal)); 
     return typeof floatVal == 'undefined' ? Math.round(randVal) : randVal.toFixed(floatVal); 
    } 
}); 

оповещения в функции removeClassImg не работает .. я использую SetTimeout в цикл это не работает нормально.

+0

Вы тоже можете дать HTML-код ....? так что мы сможем решить вашу проблему хорошо –

ответ

4

Это как-то связано с таймаутом и циклами. вам нужно обернуть его в закрытие, чтобы ваш обратный вызов с таймаутом был привязан к значению z «в то время».

Я также заметил это после цикла:

temp = new Array(); 
generateArray(temp); 

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

попробовать это:

for (var z = 0; z < 10; z++) { 
    (function (tz) {     //"localize" temp[z] by creating a scope 
     tnest(tz);     //that makes temp[z] local. this is done 
     setTimeout(function() {  //by creating an immediate function 
      removeClassImg(tz)  //passing temp[z] into it. that way, the 
     }, 3000);      //timeout receives a local temp[z] which 
    }(temp[z]));      //has the value of temp[z] "at that time" 
} 

Вот a sample with the closure и a sample without it. Через 3 секунды вы увидите, что без него будет записываться все 10 секунд вместо 0-10.

+0

Все еще не работает –

+0

@harpreetkaur обновлен. – Joseph

2

Это потому, что вы получаете доступ к переменной z в функции, которую вы установили в setTimeout, создавая замыкание, и в цикле используется z. Это означает, что вы, вероятно, закончите, чтобы z равнялся 10, когда функция setTimeout вызывает функцию.

Я уже обсуждал эту проблему и возможные решения здесь: How to pass a variable into a setTimeout function? Я думаю, это поможет вам!