在方法执行之间等待一段时间
Waiting a period of time between method executions
我理解使用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
之后,我在第一个函数中的代码继续运行,使得延迟实际上毫无用处。
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
}
相关文章:
- Canvas+svg路径动画,在路径中的特定点暂停一段时间,然后继续
- 收集一段时间内的EMG数据.建议JS
- 在一段时间内切换文本
- 如何停止字幕文本一段时间,然后继续
- HTTP服务器在一段时间后停止(Node.js)
- Hammer.js过了一段时间就停止工作了
- Meteor-在一段时间内解锁模板(按日期)
- 画布在一段时间后开始滞后
- JS-在一段时间后水平移动图像
- AJAX 调用在获得响应并成功执行时会冻结浏览器一段时间
- 表单提交在一段时间循环PHP,jquery
- 一段时间后生成回发
- 一段时间后自动点击提交按钮
- 如何每隔一段时间更改我网站的背景颜色
- 在 PhantomJS 中在页面上下文中的控制台日志之间等待一段时间
- 如何构建一个在上一个 ajax 承诺解析后等待一段时间的 rx 轮询器
- 我是否应该等待一段时间,通过谷歌验证,才能在我的页面上看到广告
- 在方法执行之间等待一段时间
- 如何在函数运行后等待一段时间
- Javascript-在只运行一次脚本之前等待一段时间