我正在建立一个西蒙游戏,并为每个新一轮建立了一个功能:
var game = [];
var squares = ["green", "red", "blue", "yellow"];
var newRound = function() {
// adds a new round to the end of the game array
game.push(squares[Math.floor(Math.random() * squares.length)]);
// for loop to run through the game array
for (var x = 0; x < game.length; x++) {
playButton(game[x]);
}
}
然后,我构建了另一个函数,它控制每次广场被用户点击或通过我的for循环循环时的动画和声音
var playButton = function(color){
$("#"+color).addClass(color+"--active active", 300, function(){
$("#audio-"+color).trigger('play');
$("#"+color).removeClass(color+"--active active", 300)
});
现在,我的for-loop只需一次循环播放所有动画和声音。如何让for循环等待playButton函数在再次循环之前完成执行?
答案 0 :(得分:5)
您可以将for循环转换为播放当前按钮的递归函数,然后在所有动画完成后尝试播放下一个按钮。类似的东西:
var newRound = function() {
// adds a new round to the end of the game array
game.push(squares[Math.floor(Math.random() * squares.length)]);
// start playing from the first button
playButton(game, 0);
}
function playButton(game, index) {
if (index < game.length) { // if this button exists, play it
var color = game[index];
$("#" + color).addClass(color + "--active active", 300, function() {
$("#audio-" + color).trigger('play');
$("#" + color).removeClass(color + "--active active", 300, function() {
playButton(game, index + 1); // once this button was played, try to play the next button
});
});
}
}
答案 1 :(得分:0)
Javascript是单线程的,所以你要求的已经发生了。但是,您的DOM未更新,因为有时您的DOM元素不存在。 DOM更新与您的javascript不同步。
相反,您可以按设定的时间间隔执行playButton
功能。
if(x<game.length) {
setInterval(playButton(x), <someSmallNumber like 0.2 milliseconds>);
}
然后递增x。通过递增颜色,x会增加,因为它是通过引用传递的。
var playButton = function(color){
$("#"+color).addClass(color+"--active active", 300, function(){
$("#audio-"+color).trigger('play');
$("#"+color).removeClass(color+"--active active", 300)
color++;
});