2013-12-19 2 views
0

에 대한 내부 발사되지 않은 I false로 변수를 설정의 setTimeout 기능을 다음과 같은 jQuery 코드를 가지고 있지만 그것은 결코 작동하지 않고 변수가 항상에서는 setTimeout 루프

 for(var ff = 0; ; ff++) 
     { 
     if(dif == 0){ 
      break; 
     } 
     if (locked){ 
      // locked = false; 
      setTimeout(function(){ locked = false; },2000); 
     } 
     else{ 
      LeftKeyPressed(); 
      locked = true ; 
      setTimeout(function(){ locked = false; },3000); 
      dif--; 
     } 
     } 

사람이 어떻게 도움을 수있는 사실로 남아 true로 설정 한 후 정확히 2 초 후에 잠금 변수를 false로 설정합니다.

여기는 fiddle of this issue입니다.

+2

이 문제를 복제하는 jsfiddle을 제공합니다. dif 무엇입니까? 이 스 니펫을 어떻게 부릅니까? 이 구문은 틀린 것입니다 :'dfd.done (LeftKeyPressed());'는 :'dfd.done (LeftKeyPressed);이어야합니다. 그렇지 않으면이 함수의 코드를 모른다는 것입니다. –

+1

일반적으로 변수의 값 변화에 반응하기 위해 무한 루프를 사용하는 것은 좋지 않습니다. 최소한 50ms 정도마다 값을 확인하는 간격을 두거나, 필요한 곳에 더 큰 상황을 표시하면 실제 목표를 달성 할 수있는 더 나은 방법이 있다는 것을 확신 할 수 있습니다. – JJJ

+4

javascript에서 "for (var ff = 0;; ff ++)"와 같은 무한 루프를 수행하지 않으면 루프가 사용 가능한 모든 시간이 걸리기 때문에 이벤트 루프를 차단하고 해당 루프가 실행되지 않을 수 있으므로 사이트가 응답하지 않을 수 있습니다 . –

답변

0

요구 사항이 그들은 내가 당신이 원하는 정확히 잘 모릅니다 무엇인지하지만이 가까운이기 때문에 좋아요, 내가 만들어 관리 할 수 ​​: http://jsfiddle.net/db6gJ/

그것은 방법을 세 번 호출하고 당신에게 무엇을 할 수있는 변화를 준다 잠긴 상태가 거짓이거나 사실 일 때 수행하려는 작업. 또한 이벤트 루프 (무한 루프)를 차단하지 않으므로 timeOut 호출이 실행되는 동안 사이트에서 다른 작업을 수행 할 수 있습니다.

자바 스크립트도 여기에 코드 :

var locked = true, 
    timesMax = 3, 
    timeCurrent = 0; 

var inputLoop = function() { 

    var delay = 2000; 

    if(locked) { 

     // Do something when locked is true 
     console.log("locked is true!"); 

     locked = false; 

    } else { 

     // Do something when locked is false 
     console.log("locked is false!"); 

     locked = true; 
     delay = 3000; 

    } 

    timeCurrent++; 

    // call again after delay, but call only 3 times 
    if(timeCurrent < timesMax) { 
     setTimeout(inputLoop, delay); 
    } 

}; 

// Launch it 
inputLoop(); 

당신이 당신의 자바 스크립트 콘솔을 보는 경우 (크롬에서 : 오른쪽 마우스 클릭 -> 요소를 검사 -> 콘솔)는 인쇄한다 : 또한

locked is true! 
locked is false! 
locked is true! 

주목해야 할 점은 원래 코드가 완료되면 alert('out');이되었지만 솔직히 "inputLoop"코드가 대기중인 콜백 호출 이외의 작업을 수행하지 않는 동안 코드가 다른 곳에서 계속 실행되고 이것이 실행되는 방식입니다. 해야한다.

당신이 당신이 될 수있는 이전의 라인 중 하나 수정할 수 있습니다 마지막으로 시간을 호출 할 때 알고 wan't 경우

:

// call again after delay, but call only 3 times 
if(timeCurrent < timesMax) { 
    setTimeout(inputLoop, delay); 
} else { 
    // Last call in this method 
    console.log('done!'); 
} 
관련 문제