2014-02-08 3 views
0

Я хочу бесконечный цикл, который предупреждает 1, 2, 3, 1, 2, 3, ... с интервалом в 2000 миллисекунд. Но это не работает. Однако консоль не показывает никаких ошибок. В чем проблема?setInterval в течение цикла не работает

for (i = 1; i <= 3; i++) { 
    setInterval(function() { 
     alert(i); 
    }, 2000); 

    if (i == 3) { 
     i = 0; 
    } 
} 
+0

«но это не работает» --- что это значит? PS: используйте 'while (true)' и 'i' counter вместо – zerkms

+0

он не показывает какой-либо выход на chrome – user3286309

+0

Что относительно условия' i <= 3' – user3286309

ответ

0

Для этого вам не понадобится петля, интервал уже идет бесконечно. Попробуйте вместо этого:

var i = 1; 

setInterval(function() { 
    alert(i); 

    i++; 

    if(i > 3) { 
     i = 1; 
    } 
}, 2000); 
0
you can not setInterval() inside a for loop because it will create multiple timer instance. 

Метод setInterval() вызывает функцию или вычисляет выражение через заданные интервалы времени (в миллисекундах).

Метод setInterval() будет продолжать вызов функции до тех пор, пока не будет вызвана функция clearInterval(), или окно будет закрыто.

Значение идентификатора, возвращаемое setInterval(), используется как параметр для метода clearInterval().

Совет. Для выполнения функции только один раз, после заданного количества миллисекунд, используйте метод setTimeout().

var i = 0 
    function test() { 
     i = i % 3; 
     ++i; 
     alert(i); 
    }; 

    setInterval('test()', 2000); 
+0

«вы не можете установитьInterval() внутри цикла for». --- это не так. – zerkms

+0

вы можете это сделать, но что произойдет? он создаст несколько экземпляров таймера .. что парень пытается сделать цикл с помощью setInterval. так почему вы предпочитаете setIntervaL внутри цикла? это значимо? –

+1

"вы не можете установитьInterval() внутри цикла for." --- Никакого ограничения языка в этом нет. Эта фраза просто неверна. – zerkms

0

Причина, почему это не работает, потому что вы входите в бесконечный цикл в блокирующем состоянии, а это означает, что интервал никогда не вводится в браузер занят перекручивание. Представьте, что браузер может делать только одну вещь за раз, как в одном потоке, так что это цикл, и не может делать ничего другого, пока это не будет сделано, и в вашем случае это никогда не будет, поэтому интервал ждет его поворота, который он никогда не получает.

Вы не могли бы сделать это ни блокирующих, как это:

function recursion() { 
    for (var i = 1; i < 4; i++) { 
     var num = i; 
     setInterval(function() { 
      console.log(String(this)); 
     }.bind(num), 2000); 
    } 
    recursion(); 
} 
recursion(); 
1

Это будет делать:

var i = 0; 
setInterval(function() { 
    i += 1; 
    if (i == 4) { 
     i = 1; 
    } 
    alert(i); 
}, 2000); 

Я проверил это хром тоже.

Он выдает 1,2,3,1,2,3 ... как вы просили.

Смежные вопросы