我理解使用setTimeout
和setInterval
来延迟方法的开始,但我遇到了一个问题。我希望有三个cpu播放器(在纸牌游戏中)“轮流”。他们应该轮到他们,然后在下一轮之前有500毫秒。这是我想要构建转弯的代码(现在,没有人类,所以我希望它能够连续运行):
var whoseTurn = 0;
while (true) {
setTimeout(takeTurn(players[whoseTurn]), 500);
whoseTurn = (whoseTurn + 1) % 3;
}
在另一个功能中:
function takeTurn(player) {
//Now taking a turn
}
问题是,在调用setTimeout
之后,第一个函数中的代码继续运行,导致延迟几乎没用。
答案 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
}