Что не так с этим циклом в то время как? бесконечный цикл [дубликаты]

На этот вопрос уже есть ответ здесь:

setTimeout (callback), за которым следует цикл while, который никогда не срабатывает 2 ответа

Я хотел сделать 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);
    }

Что мне не хватает? Спасибо за помощь.

 user110692530 июл. 2016 г., 19:38
Вы не можете прервать цикл. Асинхронный код не является преимущественным, поэтому он должен дождаться окончания цикла, прежде чем он запустится.
 user110692530 июл. 2016 г., 19:44

Ответы на вопрос(1)

Решение Вопроса

Поскольку Javascript является однопоточным и управляемым событиями, пока выполняется цикл while,setInterval() никогда не может выстрелить, и его обратный вызов никогда не будет вызван. Таким образом, у вас есть тупик, в котором ваш цикл while работает вечно.

Благодаря управляемой событиями природе Javascript,setInterval() помещает событие в очередь событий, но потому что вашwhile Цикл никогда не останавливается, интерпретатор никогда не достигает точки, где он может фактически завершить текущий поток выполнения JS и извлечь следующее событие из очереди событий для запуска обратного вызова таймера.

Вы не можете использоватьwhile цикл для ожидания какого-либо другого события. В Javascript другое событие не может произойти, покаwhile Сам цикл сделан. Вместо этого вам нужно использовать только таймеры и нетwhile петля. Если вы можете немного более четко объяснить, какую реальную проблему вы пытаетесь решить, мы можем предложить решение для кодирования.

Чтобы добавить к тому, что здесь не так, вы создаете новыйsetInterval() таймер каждый раз в цикле while (так что они будут накапливать миллионы активных таймеров), так что это тоже не так.

Вы не говорите точно, что вы пытаетесь достичь, но, похоже, вы можете использовать только интервальный таймер, а не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);
});

 Derek 朕會功夫30 июл. 2016 г., 19:39
Расширяя это, обратный вызов передаетсяsetInternal будет выполняться только после завершения цикла, чего не произойдет.
 jfriend0030 июл. 2016 г., 19:47
Добавлен пример кода.

Ваш ответ на вопрос