在方法执行之间等待一段时间

时间:2013-06-03 23:15:49

标签: javascript jquery settimeout setinterval

我理解使用setTimeoutsetInterval来延迟方法的开始,但我遇到了一个问题。我希望有三个cpu播放器(在纸牌游戏中)“轮流”。他们应该轮到他们,然后在下一轮之前有500毫秒。这是我想要构建转弯的代码(现在,没有人类,所以我希望它能够连续运行):

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

在另一个功能中:

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

问题是,在调用setTimeout之后,第一个函数中的代码继续运行,导致延迟几乎没用。

2 个答案:

答案 0 :(得分:0)

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

所以..这将创建一个计时器,然后在一个紧凑的循环中增加转弯。它甚至没有调用takeTurn,因为你正在调用它(通过提供参数)。不是你想要的。

一个修复方法是调用setInterval,并在每个回合结束时递增转弯。但这不会让转弯变长。 (即如果需要100毫秒,则下一轮将在400毫秒内完成。

构造它的正确方法是先开启一次,然后在每回合结束时启动一个计时器:

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

setTimeout(takeTurn, 500);

答案 1 :(得分:0)

第一种方法是使用setTimeout或setInterval,无论你喜欢什么

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

另一种方法是使用jquery promise implementation

创建promise链
$.when(takeTurn(1)).then(takeTurn(2)).then(takeTurn(3))


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

    ... do stuff

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

    return def
}