요구 사항이 그들은 내가 당신이 원하는 정확히 잘 모릅니다 무엇인지하지만이 가까운이기 때문에 좋아요, 내가 만들어 관리 할 수 : 이 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!');
}
이 문제를 복제하는 jsfiddle을 제공합니다. dif 무엇입니까? 이 스 니펫을 어떻게 부릅니까? 이 구문은 틀린 것입니다 :'dfd.done (LeftKeyPressed());'는 :'dfd.done (LeftKeyPressed);이어야합니다. 그렇지 않으면이 함수의 코드를 모른다는 것입니다. –
일반적으로 변수의 값 변화에 반응하기 위해 무한 루프를 사용하는 것은 좋지 않습니다. 최소한 50ms 정도마다 값을 확인하는 간격을 두거나, 필요한 곳에 더 큰 상황을 표시하면 실제 목표를 달성 할 수있는 더 나은 방법이 있다는 것을 확신 할 수 있습니다. – JJJ
javascript에서 "for (var ff = 0;; ff ++)"와 같은 무한 루프를 수행하지 않으면 루프가 사용 가능한 모든 시간이 걸리기 때문에 이벤트 루프를 차단하고 해당 루프가 실행되지 않을 수 있으므로 사이트가 응답하지 않을 수 있습니다 . –