为什么我的循环在迭代之间没有等待?setTimeout()
Why is my loop not waiting between iterations? setTimeout()
我正在使用jquery构建一个Simon Say游戏 http://codepen.io/meek/pen/adrbOv,我在逐个播放每个声音时遇到了一些麻烦。
当游戏开始时,会生成一个包含 20 个声音("动作")的列表,每个回合将一个接一个地播放。因此,如果移动列表是["红色","黄色","绿色"],则在第一回合"红色"将播放,在第二回合"红色"和"黄色"将播放,依此类推。
我已将转弯设置为 4,我正在尝试让每个声音一个接一个地播放,直到播放 4 个声音。我正在使用以下代码:
turn = 4;
var t = 1;
while(t <= turn) {
setTimeout(AIbutton(allMoves[t-1]), 1000);
t++;
}
AIbutton()
是播放声音(模拟按钮按下)的功能,allMoves
是将在整个游戏中播放的 20 个动作的列表。我希望它发生的情况是,在循环的每次迭代中播放一个声音,然后再进行下一次迭代,但是发生的情况是,循环中的所有声音在间隔 1000 毫秒后同时迭代播放。
我以为 setTimeout 会让它在迭代之间暂停?我怎样才能做到这一点?
setTimeout异步运行,它不是阻塞。 如果你想等待超时完成,下一次"循环迭代"需要在你给 setTimeout 的函数回调中发生。
这样的东西会起作用:
turn = 4;
var t = 1;
ourTimeout(allMovies, turn, t);
function ourTimeout(allMovies, turn, t){
AIbutton(allMoves[t-1]);
if(t <= turn)
setTimeout(ourTimeout(allMovies, turn, ++t), 1000);
}
@Alnitak提到这行代码:
setTimeout(ourTimeout(allMovies, turn, ++t), 1000);`
需要更改为:
setTimeout(function(){
ourTimeout(allMovies, turn, ++t);
}, 1000);
如@Alnitak所述,您只能将匿名函数或命名函数传递给 setTimeout。 传递变量的技巧是按照上面的更改完成的(概念称为闭包)。
相关文章:
- JavaScript setTimeout() 不会等待执行
- setTimeOut没有等待适当的延迟时间
- setTimeout未等待指定时间
- iframe 加载事件中的 setTimeout 似乎没有像预期的那样等待 x 秒
- 为什么当我调用 Meteor.setTimeout() 时,我后续的 Meteor 方法调用不会等待第一个方法完成
- 为什么我的循环在迭代之间没有等待?setTimeout()
- Meteor,错误:没有光纤在服务器上使用 Meteor.setTimeout() 就无法等待
- Javascript - 等待使用 setTimeout 的函数的真正结尾
- 我如何在页面加载的第一件事就是调用setTimeout,然后等待五秒钟
- 在测试JavaScript时,有比setTimeout更好的方法来等待asnyc回调
- setTimeout在传递代码时等待,但在传递引用时不等待
- 等待使用settimeout的函数在javascript中完成后再重新运行
- setTimeout delay不等待超时
- 如何使setTimeout表现得像等待
- setTimeout不会在更改DOM之前等待
- 为什么Javascript说“回调不是一个函数”?在setTimeout中,等待值要低得多
- 为什么new函数的setTimeout会忽略等待时间
- 在PhantomJS中等待一个没有setTimeout的元素
- setTimeout()没有等待
- setTimeout立即启动功能,而不是等待