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

Posted

技术标签:

【中文标题】如何在 JavaScript 循环中添加延迟?【英文标题】:How do I add a delay in a JavaScript loop? 【发布时间】:2011-04-04 18:23:20 【问题描述】:

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

我试过这样:

alert('hi');

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

只有第一种情况为真:显示alert('hi')后,等待3秒,然后显示alert('hello'),然后alert('hello')不断重复。

我想要的是,在alert('hello')alert('hi') 之后显示3 秒之后,它需要等待3 秒第二次alert('hello') 等等。

【问题讨论】:

for(var i=0; i 【参考方案1】:

在我看来,在循环中添加延迟的更简单、最优雅的方法是这样的:

names = ['John', 'Ana', 'Mary'];

names.forEach((name, i) => 
 setTimeout(() => 
  console.log(name);
 , i * 1000);  // one sec interval
);

【讨论】:

【参考方案2】:

无功能解决方案

我参加聚会有点晚了,但是有一个不使用任何函数的解决方案:

alert('hi');

for(var start = 1; start < 10; start++) 
  setTimeout(() => alert('hello'), 3000 * start);

【讨论】:

这将以 3 秒为间隔安排 10 个警报,而不是在 alert() 清除后的 3 秒等待时间。如果第一个 alert() 没有在 30 秒内清除,其余的将不会在它们之间暂停。【参考方案3】:
var loop=(i,time)=>new Promise(r=>
 alert("aaa",i);
 if(i>0)
 setTimeout(()=>
    r([i-1,time]);
 ,time);
).then(v=>loop(v[0],v[1]))

loop(3,1000);

试试看

【讨论】:

这需要比“试试看”更好的描述。它也与此线程上的其他帖子非常相似。【参考方案4】:
const autoPlayer = (arr = [1, 2, 3, 4, 5]) => 
  // Base case:
  if (arr.length < 1) return

  // Remove the first element from the array.
  const item = arr.shift()

  // Set timout 
  setTimeout(() => 
    console.log('Hello, world!', item)  // Visualisation.
    autoPlayer() // Call function again.
  , 1000) // Iterate every second.

嘿,我知道这篇文章很老了,但是这段代码“循环”并使用递归方法为其添加了延迟。我认为您不能“实际上”根据从其他人那里读取各种 cmets 来延迟循环本身的迭代。也许这可以帮助某人!基本上该函数接受一个数组(在本例中)。在每次迭代中,都会调用 setTimeout javascript 方法。当setTimeout 函数的计时器到期时,该函数会无限期地再次调用自身,但在每次调用时,数组都会变小,直到达到基本情况。我希望这可以帮助其他人。

【讨论】:

以上是关于如何在 JavaScript 循环中添加延迟?的主要内容,如果未能解决你的问题,请参考以下文章

在“for”循环迭代之间添加延迟

如何在JavaScript中使用async / await延迟数组回调?

使用 forEach 循环执行每次迭代后添加延迟

如何在每次通过 for 循环时增加动画延迟

Javascript无延迟播放无限循环音频文件

在 VSTS Web 测试循环中添加延迟/等待时间 [重复]