2013-06-03 3 views
0

나는 방법의 시작을 지연시키기 위해 setTimeoutsetInterval을 사용하는 것을 이해하지만 문제가 생겼습니다. 나는 카드 게임에서 3 명의 cpu 플레이어를 "회전"시키고 싶다. 그들은 자신의 차례를 거쳐 다음 단계로 넘어 가기 전에 500ms를 가져야합니다.메서드 실행 사이의 시간 대기

var whoseTurn = 0; 
while (true) { 
      setTimeout(takeTurn(players[whoseTurn]), 500); 
      whoseTurn = (whoseTurn + 1) % 3; 
     } 

을 별도의 함수에서 :

function takeTurn(player) { 
     //Now taking a turn 
    } 

문제 여기에 내가 (나는 그것을 지속적으로 실행할 수 있도록이 인간 않고, 지금이다) 턴 복용을 구성 할 코드는 즉, setTimeout이 호출 된 후 첫 번째 함수의 코드가 계속 실행되어 지연이 사실상 쓸모 없게됩니다.

+0

불행히도 그것은 작동하지 않습니다. 타임 아웃은 비동기식이며 루프는 어쨌든 끝나지 만, 당신의 경우에는 결코 끝나지 않습니다. 결국 브라우저가 멈 춥니 다. – adeneo

답변

0
var whoseTurn = 0; 
while (true) { 
     setTimeout(takeTurn(players[whoseTurn]), 500); 
     whoseTurn = (whoseTurn + 1) % 3; 
} 

이렇게 .. 그러면 타이머가 생성되고 차례가 반복됩니다. 그리고 takeTurn을 호출하는 것은 (인수를 제공하여) 호출하기 때문입니다. 네가 원하는게 아니야.

한 가지 해결 방법은 setInterval을 호출하고 각 순환 마지막에 차례를 증가시키는 것입니다. 그러나 그것은 회전이 가변 길이가되도록하지 않습니다. .는이 100ms를 취하면 (즉, 그 다음 차례는, 400ms 일에

한번 첫 번째 턴 킥오프하는 구조화하는 올바른 길을 걸어 각 턴의 끝에서 타이머를 킥오프 것

function takeTurn() { 
    player = players[whoseTurn]; 
    //Now taking a turn 
    whoseTurn = (whoseTurn + 1) % 3; 
    setTimeout(takeTurn, 500); 
} 

setTimeout(takeTurn, 500); 
0

첫 번째 방법은 JQuery와의 약속 구현을 사용하여 약속의 사슬을 생성하는 것입니다 당신이

var turnsInt = null 
    , whoseTurn = 0 
    , players = [....] 

function takeTurn() { 
    var player = players[whoseTurn] 
    ... do stuff 

    whoseTurn=(whoseTurn+1)%players.length 
} 

turnsInt = setInterval(takeTurn, 500) 

... some other code in some other place to stop it 

if(cond) { 
    clearInterval(turnsInt) 
} 

또 다른 접근 방식을 선호 어떤에서는 setTimeout이나 setInterval을을 사용하는 것입니다

$.when(takeTurn(1)).then(takeTurn(2)).then(takeTurn(3)) 


function takeTurn(whoseTurn) { 
    var def = $.Deffered() 

    ... do stuff 

    setTimeout(function() { 
     def.resolve() 
    }, 500)  

    return def 
}