Javascript установить интервал работать как отдельный поток?
Я хочу использовать таймер в качестве резерва в случае, если я закончим бесконечный цикл. Кажется, что заданный интервал - это правильный способ сделать это. Однако это не работает для меня.
Из моих исследований кажется, что setInterval должен работать в отдельном потоке в фоновом режиме, но я его не вижу.
Почему такое поведение происходит? И как это решить?
var time = 0;
window.setInterval(function(){time++;}, 1000);
while (true) {
//stuff done
if (time >= 5) {
break;
}
}
Ответы
Ответ 1
Браузер javascript запускается в одном потоке. Поэтому, если вы выполняете что-то, что занимает слишком много времени - это заморозит браузер.
Подробнее см. статью Джона Ресига: http://ejohn.org/blog/how-javascript-timers-work/
После того, как вы прочтете эту статью, вы получите, что ваш вызов setInterval
, поставленный в очередь, будет запущен через 1000 мс после этого, но только после завершения текущего кода. Он не может закончить, хотя из-за бесконечного цикла.
Ответ 2
zerkms имеет правильный ответ. Но я бы добавил, что веб-работники - это способ получить некоторое многопоточное поведение с javascript на стороне клиента.
var worker = new Worker('my_task.js');
worker.onmessage = function(event) {
console.log("Called back by the worker!\n");
};
Рабочий работает в фоновом потоке, и вы можете обмениваться сообщениями и подписываться на события. Это довольно изящно.
Ответ 3
Как уже было сказано, обратный вызов setInterval
не запускается до тех пор, пока не закончится бесконечный цикл. Чтобы сделать то, что вы пытаетесь достичь - без использования веб-работников, вы должны проверить время из самого цикла:
var start = Date.now();
while((Date.now() - start) < 5000){
...
}