javascript - 这个while循环有什么问题?永无止境的循环

时间:2016-07-30 17:37:01

标签: javascript

我想创建一个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);
    }

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

1 个答案:

答案 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);
});