如何在Javascript中通过setTimeout终止无限循环

时间:2016-10-13 11:41:12

标签: javascript while-loop

我有一段带有while循环的代码,我想通过setTimeout()来停止。但它似乎是一个无限循环,从不触发setTimeout()。如果我删除while循环,则超时触发正确。有什么问题吗?

$(document).ready(function() 
{
    var i = 0, s = false;

    setTimeout( function()
    {
        s = true;
        console.log( "Timeuot!!!" );
        console.log( "s value is " + s );
    }, 1000 );

    while( s === false )
    {
        console.log( "this is while and s is " + s );
        i++;
    }

    console.log( "iterations: " + i );
});

3 个答案:

答案 0 :(得分:6)

JavaScript运行单个事件循环。它不会在函数中间停止,以查看是否有任何事件(例如点击或超时)会触发不同的功能。

简而言之:它不会运行定时功能,直到while循环结束。

要做这种事情,你通常会有一个事件驱动的迭代器。



var i = 0,
  s = false;

setTimeout(function() {
  s = true;
  console.log("Timeuot!!!");
  console.log("s value is " + s);
}, 1000);

next();

function next() {
  if (s) {
    return done();
  }
  console.log({
    s, i
  });
  i++;
  setTimeout(next, 0);
}

function done() {
  console.log("iterations: " + i);
}




答案 1 :(得分:1)

如前所述,while循环阻止了唯一的线程。为了让你的例子做你想要的事情,用setInterval(function)替换while循环,如下所示:

$(document).ready(function() 
{
    var i = 0, s = false;

    setTimeout( function()
    {
        s = true;
        console.log( "Timeout!!!" );
        console.log( "s value is " + s );
    }, 1000 );


    var interval = setInterval(function() {
      console.log( "this is while and s is " + s );
      i++;      
      if (s) {
        clearInterval(interval);
        console.log("i is " + i)
      }
    }, 100);    
});

答案 2 :(得分:0)

从不调用setTimeout事实是while永远不会结束,因此偶数调度程序不会触发setTimeout。