2012-05-24 2 views
1
를 작동하지

가능한 중복 :
setTimeout in a for-loop and pass i as value의 setTimeout은

내가 동적 배열을 생성하려고 및 루프 등이 배열을 사용하여 ..하지만 루프 settime 밖으로 작동하지 않습니다 있어요 또는 기능이 작동하지 않습니다. 다음은 작업 .. 내가 루프이 잘 작동하지 않습니다에서의 setTimeout을 사용하고 있지 않습니다 내 코드 기능 removeClassImg에서

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); 
    } 
}); 

경고입니다.

+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 closurea sample without it입니다. 3 초 후에 0-10 대신 10을 모두 기록 할 것입니다.

+0

아직도 작동하지 않습니다. –

+0

@harpreetkaur가 업데이트되었습니다. – Joseph

2

setTimeout에 설정 한 함수에서 변수 z에 액세스하여 클로저를 만들고 루프에 z이 사용 되었기 때문입니다. 즉, setTimeout이 함수를 호출 할 때 z10과 같을 것입니다.

이미이 문제와 가능한 해결책에 대해 이미 말씀 드렸습니다. How to pass a variable into a setTimeout function? 도움이 될 것 같습니다.

관련 문제