我想创建一个JSFiddle,但是代码崩溃了你的标签/窗口......这个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);
}
我错过了什么?谢谢你的帮助。
答案 0 :(得分:1)
因为Javascript是单线程和事件驱动的,只要你的while循环正在运行,setInterval()
就永远不会触发,它的回调永远不会被调用。所以你有一个死锁,你的while循环只是永远运行。
使用Javascript的事件驱动特性,setInterval()
将事件放入事件队列,但由于您的while
循环永远不会停止运行,解释器永远不会达到实际完成的程度JS执行的当前线程并将下一个事件拉出事件队列以运行计时器回调。
您不能使用while
循环来等待其他事件发生。在Javascript中,另一个事件不会发生,直到while
循环本身完成。相反,您只需要使用计时器而不需要while
循环。如果您能够更清楚地解释一下您尝试解决的真正问题,我们可以建议编码解决方案。
要在这里添加错误的内容,您每次通过while循环都会创建一个新的setInterval()
计时器(因此它们会堆积数以万亿计的活动计时器),以便'也搞砸了。
你不能确切地说出你想要完成的事情,但看起来你只能使用间隔计时器而不是while
循环。所以,假设你想要运行150次,间隔500ms,你可以使用它:
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);
});