Работа setTimeout в фоновом режиме?

122
17 мая 2019, 14:50

Я новичок, и задался проблемой написать таймер pomodoro с помощью js. Реализовал это с помощью setTimeout. Ниже кусок кода, который обеспечиват работу непосредственно таймера

function timer(){
    var dataBefore = new Date().getTime();
    if (timeNow > 0 && start === true){
        timeNow-=100;
        $('#time').html(convertForUser(timeNow));
        if (timeNow <= 0){
            counter+=1;
            if (counter % 2 === 1){
                timeNow = timeRest;
                $("#site-ico").attr("href", "/green.ico")
                $('.logo').html('<img src="/logo_rest.png" alt="logo"></img>');
            }
            else{
                timeNow = time;
                $("#site-ico").attr("href", "/red.ico")
                $('.logo').html('<img src="/logo_work.png" alt="logo"></img>');
            }
        }
        var diff = (new Date().getTime() - dataBefore);
    }
    else{
        return;
    }
    setTimeout(timer,(100-(diff*10)));
}  

И все вроде адекватно работет, однако при потере фокуса, если во время работы приложения переключиться на другую вкладку, выполнение кода прекращается, таймер перестает работать. Как можно решить данную проблему?

Answer 1

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

Конкретно для вашей задачи есть готовая библиотека https://www.npmjs.com/package/worker-timers

READ ALSO
Добавление и удаление required через jQuery

Добавление и удаление required через jQuery

Не могу понять почему не работает код:

162
js положение scroll не запоминает

js положение scroll не запоминает

Не могу понять почему скролл не запоминает своё положение

127