为什么我的循环在迭代之间没有等待?setTimeout()

Why is my loop not waiting between iterations? setTimeout()

本文关键字:等待 setTimeout 循环 我的 迭代 之间 为什么      更新时间:2023-09-26

我正在使用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。 传递变量的技巧是按照上面的更改完成的(概念称为闭包)。