JavaScript - 这个while循环有什么问题?永不结束
我想制作一个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);
}
我错过了什么?谢谢您的帮助。
因为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);
});
在此扩展,只传递给'setInternal'的回调函数循环完成后,哪些不会发生。 –
添加代码示例。 – jfriend00
不能中断循环。异步代码不是先发制人的,所以它必须等到循环结束才能运行。 – 2016-07-30 17:38:47
请参阅[什么是XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – 2016-07-30 17:44:58