2016-07-30 169 views
0

我想制作一个JSFiddle,但代码崩溃了你的标签页/窗口......这个while循环出了什么问题?它看起来是对的...JavaScript - 这个while循环有什么问题?永不结束

var commentLoop = 150; 
    var whileLoop = true; 
    var count = 0; 

    while (whileLoop === true) { 
     setInterval(function() { 
      console.log("my regular code goes here"); 
      if (count == commentLoop - 1) { 
       console.log("just entered while loop thing"); 
       whileLoop = false; 
      } 
      count++; 
     }, 500); 
    } 

我错过了什么?谢谢您的帮助。

+1

不能中断循环。异步代码不是先发制人的,所以它必须等到循环结束才能运行。 – 2016-07-30 17:38:47

+1

请参阅[什么是XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – 2016-07-30 17:44:58

回答

1

因为Javascript是单线程和事件驱动的,只要你的while循环运行,setInterval()永远不会触发,它的回调将永远不会被调用。所以你有一个死循环,你的while循环会永远运行。

由于Javascript的事件驱动特性,setInterval()将事件放入事件队列中,但由于您的循环从不停止运行,解释器永远不会达到它可以真正完成当前的JS执行线程的程度,将下一个事件拉出事件队列以运行定时器回调。

您不能使用while循环等待其他事件发生。在Javascript中,除非while循环本身完成,否则其他事件不会发生。相反,您只需要使用定时器,并且不需要使用while循环。如果您可以更清楚地解释您想要解决的实际问题,我们可以提供一种编码解决方案。

要在这里添加错误的东西,您需要每次通过while循环创建一个新的setInterval()计时器(这样他们就会堆积无数的计时器),这样也会搞砸了。

你不完全说你正在努力完成什么,但看起来你只能使用间隔计时器,而不能使用while循环。因此,假设你要运行一些操作150次,间隔500毫秒之余,你可以这样做:

var count = 0; 
var commentLoop = 150; 
var timer = setInterval(function() { 

    // regular code here 

    // check if we're done repeating 
    if (count === commentLoop - 1) { 
     // stop the timer 
     clearInterval(timer); 
    } else { 
     count++; 
    } 

}, 500); 

或者,这可能进入一个效用函数(你可以运行这段代码,看看它的工作):

function repeat(numTimes, delay, fn) { 
 
    var cntr = 0; 
 
    var timer = setInterval(function() { 
 
     if (cntr >= numTimes) { 
 
      clearInterval(timer); 
 
     } else { 
 
      // if callback returns true, then stop the timer 
 
      if (fn(cntr) === true) { 
 
       clearInterval(timer); 
 
      } 
 
      ++cntr; 
 
     } 
 
    }, delay); 
 
} 
 

 
// sample usage 
 
repeat(5, 400, function(cnt) { 
 
    console.log(cnt); 
 
});

+0

在此扩展,只传递给'setInternal'的回调函数循环完成后,哪些不会发生。 –

+0

添加代码示例。 – jfriend00