【问题标题】:Why is my loop not waiting between iterations? setTimeout()为什么我的循环在迭代之间没有等待?设置超时()
【发布时间】:2016-02-19 17:03:37
【问题描述】:

我正在使用 jquery 构建一个西蒙说游戏 http://codepen.io/meek/pen/adrbOv,但我在逐个播放每个声音时遇到了一些问题。

游戏开始时,会生成一个包含 20 个声音(“动作”)的列表,每回合会一个一个地播放。因此,如果移动列表是 ['red', 'yellow', 'green'],则在第一回合播放“red”,在第二回合播放“red”和“yellow”,依此类推。

我已将轮数设置为 4,我试图让每个声音一个接一个地播放,直到播放 4 个声音。我正在使用此代码:

turn = 4;
var t = 1;
  while(t <= turn) {
    setTimeout(AIbutton(allMoves[t-1]), 1000);
    t++;
  }

AIbutton() 是播放声音的函数(模拟按钮按下),allMoves 是整个游戏中将播放的 20 个动作的列表。我希望它发生的是在循环的每次迭代中播放一个声音,然后再进入下一次迭代,但是会发生的是循环中的所有声音在 1000 毫秒的间隔后同时迭代播放.

我认为 setTimeout 会使其在迭代之间暂停?我怎样才能做到这一点?

【问题讨论】:

    标签: javascript jquery loops


    【解决方案1】:

    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。传递变量的技巧就是上面提到的变化(概念称为闭包)。

    【讨论】:

    • 此代码不正确 - 您需要将函数引用传递给 setTimeout(例如匿名函数表达式),而不是调用 ourTimeout 的结果。
    • 这正是我所需要的,我现在明白为什么了。谢谢!
    猜你喜欢
    • 2021-03-16
    • 2013-01-23
    • 1970-01-01
    • 2023-01-27
    • 2019-03-07
    • 1970-01-01
    • 2015-10-22
    • 2018-06-12
    相关资源
    最近更新 更多