Javascript:使用 setInterval 同步迭代 for 循环

标签 javascript jquery asynchronous setinterval

我正在开发 Simon Says 程序,在调用计算机的一系列 Action 并将其显示在屏幕上时遇到了问题。

我正在尝试使用此 aiMoves() 函数来迭代数组并通过突出显示适当的颜色按钮来显示每个 Action 。我尝试使用 setInterval 以便第一个按钮突出显示,程序等待一秒钟,然后下一个按钮突出显示,如下所示:

function aiTurns(randNum){
  for(var i = 0; i < aiMoves.length; i++) {
    if(aiMoves[i] === 1){
      //sound1();
      $('#green').addClass("active");
      setTimeout(function(){
        $('#green').removeClass("active");
      }, 500);
    }
    else if(aiMoves[i] === 2){
      //sound2();
      $('#red').addClass("active");
      setTimeout(function(){
        $('#red').removeClass("active");
      }, 500);
    }
    else if(aiMoves[i] === 3) {
      //sound3();
      $('#yellow').addClass("active");
      setTimeout(function(){
         $('#yellow').removeClass("active");
        }, 500);
      }
      else if(aiMoves[i] === 4){
      //sound4();
      $('#blue').addClass("active");
      setTimeout(function(){
        $('#blue').removeClass("active");
      }, 500);
    }
    level--;
    playerTurn = true;
  }

}

我这样调用它:

var moves = function() {
aiTurns(randomNumber());

}

setInterval(moves, 2000);
} 

问题是 setInterval 是异步的,并且 aiMoves() 中 for 循环的所有迭代都会同时调用。如何设置以便执行数组的第一个元素,暂停,然后执行下一个元素?

这是用于更好可视化的代码笔: https://codepen.io/nick_kinlen/pen/oGjMMr?editors=0010

最佳答案

由于 for 循环会立即运行直至完成,因此您需要采用不同的方式来连续运行异步代码。这是一个简单的抽象,可让您在每次迭代之间以给定的延迟循环遍历数组:

function intervalForEach (array, iteratee, delay) {
  let current = 0

  let interval = setInterval(() => {
    if (current === array.length) {
      clearInterval(interval)
    } else {
      iteratee(array[current])
      current++
    }
  }, delay)
}

所有条件逻辑都可以进入 iteratee 函数内部,该函数只接受数组中的当前项。 Here's一个工作示例。

关于Javascript:使用 setInterval 同步迭代 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46799300/

相关文章:

javascript - 隐藏 div 中的 tinyMCE 仅在第一次更新并且变为只读

jQuery slideDown() 返回 is null 错误

php - 创建元素和 insertBefore 不起作用

Javascript 在 Mac cocoa 应用程序中向 objective-c 发送消息

javascript - 使用下划线在javascript中进行惰性范围迭代

javascript - 异步调用链,其中最后一个调用与第一个调用进行比较

java - 设计通用的可取消异步操作接口(interface)

javascript - 尽管将 JavaScript 放在静态目录中,但无法将 JavaScript 应用到 Flask 中的模板。我该如何解决下面代码中的问题?

javascript - jQuery - <option> 被添加到 <select> 内部和之后

c# - 确定 ForEachAsync 并行度的因素