for循环可以等到其中的函数执行完毕吗?

时间:2015-11-05 18:14:39

标签: javascript jquery function for-loop

我正在建立一个西蒙游戏,并为每个新一轮建立了一个功能:

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函数在再次循环之前完成执行?

code sample on CodePen

2 个答案:

答案 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++;
});