在 Javascript 中的 while 循环内创建暂停

Posted

技术标签:

【中文标题】在 Javascript 中的 while 循环内创建暂停【英文标题】:Create a pause inside a while loop in Javascript 【发布时间】:2011-05-31 16:29:41 【问题描述】:

我想在 while 循环中创建一个暂停,以便我可以创建 n 动画,每个动画在另一个之后出现 3 秒。

我尝试了以下方法,但它不起作用。希望有人告诉我我做错了什么。

i=0;
while (i < n) 
    someanimation();
    setTimeout(function()
        i++;
    , 3000);
     
;

【问题讨论】:

How do I add a delay in a javascript loop?的可能重复 【参考方案1】:

setTimeout 不会暂停;它要求 Javascript 稍后运行其他代码。

搜索“setTimeout 循环”可以准确告诉您需要了解的内容。如果你环顾四周,它甚至会提到 setInterval。区别:使用 setTimeout 循环将在循环之间等待 3 秒,而 setInterval 将使循环总共需要 3 秒(包括动画花费的时间,只要它少于 3 秒 :) )。此外, setInterval 构造了一个无限循环,您必须在所需的次数后退出该循环; setTimeout 需要你自己构建循环。

i = 0;

// setTimeout approach
function animation_loop() 
  someAnimation();
  setTimeout(function() 
    i++;
    if (i < n) 
      animation_loop();
    
  , 3000);
;
animation_loop();

// setInterval approach
i = 0;
someAnimation();
iid = setInterval(function() 
  i++;
  if (i < n) 
    someAnimation();
   else 
    clearInterval(iid);
  
, 3000);

【讨论】:

你摇滚!!非常感谢 - 我是一个真正的初学者,所以我不熟悉这些成语,而且我并不总是知道谷歌的最佳关键字是什么。不管怎样,你真的让我大开眼界了!! 这个答案引入了一个无限的setInterval。我最好在i &gt;= n时清除setInterval @A1rPun 同意;我更新了代码以包含它(以及更清晰地标记正在发生的事情)。【参考方案2】:

好吧,感谢带有 Promises 的 ES6-7,我们现在可以暂停一下,同时让它看起来更漂亮!

var id = 0;

async function do() 
  while(true) 
    await pause(id);
    //will happen only after pause is done
    id++; 
  

function pause(id) 
  return new Promise(resolve => setTimeout(() => 
    console.log(`pause $id is over`);
    resolve();
  , 1500)); 


do();

【讨论】:

【参考方案3】:

其中一种方法是使用 RxJS。请看working example here

Rx.Observable
  .interval(1000)
  .take(10)
  .subscribe((x) => console.log(x))

【讨论】:

【参考方案4】:
function myFunction() 
    var x;
for(var i=0;i<10;i++)
    if (confirm("Press a button!") == true) 
        x = "You pressed OK!";
     else 
        x = "You pressed Cancel!";
    
    document.getElementById("demo").innerhtml = x;

``

【讨论】:

【参考方案5】:

setTimeout 比这要复杂一些,因为它不会阻塞(即在继续程序之前它没有完成等待超时)。

你想要的更接近这个:

var i = 0;
function nextFrame() 
    if(i < n) 
        someanimation();
        i++;
        // Continue the loop in 3s
        setTimeout(nextFrame, 3000);
    

// Start the loop
setTimeout(nextFrame, 0);

也许值得您阅读setInterval 作为一种可能的替代方案。

【讨论】:

【参考方案6】:

创建一个类似的函数:

function sleep_until (seconds) 
   var max_sec = new Date().getTime();
   while (new Date() < max_sec + seconds * 1000) 
    return true;

然后将代码更改为

i=0;
while (i < n) 
    someanimation();
    sleep_until(3);
    do_someotheranimation();
;

【讨论】:

阻止 js 正是我想要的。 有时您确实想阻止引擎..(希望只是为了测试)【参考方案7】:

您对自己想要做什么并不是很具体,但我想说主要问题是您毫不拖延地致电someanimation()。所以也许这可以为你解决:

for (var i = 0; i < n; i++) 
    setTimeout(someanimation, 3000 * i);
;

注意someanimation 后面缺少的(),因为它是setTimeout() 的回调。

【讨论】:

请不要重新发明有标准成语的东西。 @Karl Knechtel:你在说什么?什么“标准习语”?你的想法是一样的。唯一的区别是您在计时器函数中启动了对someanimation() 的下一次调用。 "...您在计时器函数中启动对 someanimation() 的下一次调用。"这正是标准的成语。这样,一次只有一个回调入队。 这将同时将所有迭代排入队列,然后等待 3 秒以同时转储对某个动画的调用。 @BrettMathe *sigh* jsfiddle.net/fw4mmgca 看看时间戳。请在下次投反对票之前弄清楚你的事实。

以上是关于在 Javascript 中的 while 循环内创建暂停的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 中的 While 循环与 For 循环? [关闭]

while 循环中的赋值 - Javascript

JavaScript 中的反向 while 循环如何知道何时停止?

JavaScript 循环

JavaScript:while循环中的异步方法

为啥javascript不会在while循环中堆叠