当前位置: 首页 > 面试题库 >

如何在JavaScript循环中添加延迟?

周宏伯
2023-03-14
问题内容

我想在while循环内添加延迟/睡眠:

我这样尝试过:

alert('hi');

for(var start = 1; start < 10; start++) {
  setTimeout(function () {
    alert('hello');
  }, 3000);
}

只有第一种情况是正确的:显示后alert('hi'),它将等待3秒钟,然后alert('hello')显示,但随后alert('hello')将不断重复。

我想要的是在alert('hello')显示3秒之后显示出来,alert('hi')然后它需要第二次等待3秒alert('hello'),依此类推。


问题答案:

setTimeout()函数是非阻塞的,将立即返回。因此,您的循环将非常快速地迭代,并且将快速连续地发起3秒超时触发。这就是为什么您的第一个警报会在3秒钟后弹出,而其余所有警报都将连续不断地出现。

您可能要改用以下方式:

var i = 1;                     //  set your counter to 1

function myLoop () {           //  create a loop function
   setTimeout(function () {    //  call a 3s setTimeout when the loop is called
      alert('hello');          //  your code here
      i++;                     //  increment the counter
      if (i < 10) {            //  if the counter < 10, call the loop function
         myLoop();             //  ..  again which will trigger another 
      }                        //  ..  setTimeout()
   }, 3000)
}

myLoop();                      //  start the loop

您也可以通过使用自调用函数将迭代次数作为参数来修饰它:

(function myLoop (i) {          
   setTimeout(function () {   
      alert('hello');          //  your code here                
      if (--i) myLoop(i);      //  decrement i and call myLoop again if i > 0
   }, 3000)
})(10);                        //  pass the number of iterations as an argument


 类似资料:
  • 我在mysql数据库中有一个数组数据,我想在使用Ajax得到结果后,用for循环逐个显示出来。过程是这样的。 这是将呈现每个项的段落 null 当我尝试使用for循环时,它会说语法错误,意外的for循环被取走,我该如何解决这个问题,例如,这里我使用sample for循环来使事情尽可能简单。

  • 问题内容: 这段代码返回:8或10或6作为循环后映射的长度。视频在这里, 游戏 在这里。 我看到新添加的元素进入范围,但无法解释为什么此循环随机停止吗? 问题答案: 规格:对于声明: 未指定地图的迭代顺序,并且不能保证每次迭代之间都相同。如果在迭代过程中删除了尚未到达的映射条目,则不会生成相应的迭代值。 如果在迭代过程中创建了映射条目,则该条目可能在迭代过程中产生或可以被跳过。 对于创建的每个条目

  • 如何在不停止主GUI线程的情况下停止循环?(线程。睡眠(1000)未工作)

  • 我在试着理解为什么一些简单的环路会以这样的速度运行 第一种情况: 根据IACA,吞吐量是1个周期,瓶颈是端口1,05。我不明白为什么它是1 cylce。毕竟我们有两个循环承载的依赖关系: 而且这种Latency是循环进行的,所以它应该会减慢我们的迭代。 第二种情况: 我更不明白为什么吞吐量是1.65。