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

Waiting a period of time between method executions

本文关键字:等待 一段时间 之间 执行 方法      更新时间:2023-09-26

我理解使用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之后,我在第一个函数中的代码继续运行,使得延迟实际上毫无用处。

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

第一种方法是使用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的承诺实现来创建承诺链

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

function takeTurn(whoseTurn) {
    var def = $.Deffered()
    ... do stuff
    setTimeout(function() {
       def.resolve()
    }, 500)       
    return def
}