Подтвердить что ты не робот

Javascript установить интервал работать как отдельный поток?

Я хочу использовать таймер в качестве резерва в случае, если я закончим бесконечный цикл. Кажется, что заданный интервал - это правильный способ сделать это. Однако это не работает для меня.

Из моих исследований кажется, что setInterval должен работать в отдельном потоке в фоновом режиме, но я его не вижу.

Почему такое поведение происходит? И как это решить?

var time = 0;
window.setInterval(function(){time++;}, 1000);
while (true) {
    //stuff done
    if (time >= 5) {
        break;
    }
}
4b9b3361

Ответ 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){
  ...
}