【问题标题】:javascript - What is wrong with this while loop? never ending loop [duplicate]javascript - 这个while循环有什么问题?永无止境的循环[重复]
【发布时间】:2016-07-30 17:37:01
【问题描述】:

我想制作一个 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);
    }

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

【问题讨论】:

  • 你不能中断循环。异步代码不是抢占式的,因此它必须等待循环结束才能运行。

标签: javascript


【解决方案1】:

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

由于 Javascript 的事件驱动特性,setInterval() 将一个事件放入事件队列,但是因为您的 while 循环永远不会停止运行,解释器永远不会到达它可以实际完成当前线程的地步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);

或者,这可以进入一个实用函数(你可以运行这个 sn-p 来查看它的工作):

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的回调只会在循环完成后执行,它不会发生。
  • 添加代码示例。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2014-04-17
  • 2019-03-03
  • 1970-01-01
相关资源
最近更新 更多