бажит setTimeout в неактивной вкладке в Chrome
Приветствую.
Мне рапортуют баг в моем приложении, но сам я его не могу повторить, речь идет о Chrome на виндовс. Стоит обычный код, через 5 минут проверка на "неактивность": setTimeout(check, 300000); , но у них получается он : - открывает форму, отсчет пошел. - переходит на другие вкладки - эта проверка происходит в реалии только через 8 минут Гуглил про какие то оптимизации в неактивных вкладках, когда setInterval на 1 сек переводится, но чтобы такое... Встречали и как такое фиксить? Может банально можно таймер установить работать правильно? |
С Chrome 88+ интервал увеличивается до 1 мин, если вкладка неактивна больше 5 мин.
https://usefulangle.com/web-updates/...imers-1-minute https://developer.chrome.com/blog/ti...-in-chrome-88/ |
Ну у меня вроде ж как и не интервал это.
Неужто оно как то прибавляет к моему еще что то за неактивность? |
Он вообще может отрубить все интервалы и таймауты на неактивной вкладке.
Был хак для сохранения вкладки активной - проигрывание тишины в audio. Но теперь он не поможет, т.к. автозапуск аудио запретили(правильно сделали, впрочем). Как сейчас с этим справляются - хз, я не трогаю неактивные вкладки.) P.S. setTimeout в любом случае ничего не гарантирует. Указанное время задержки означает "не раньше чем". |
Буду наверное сам считать метки времени и разницу, реально прошедшую.
Странно выглядит "замирание" страницы при неактивной вкладке. В современном SPA приложении( у меня не оно), которое типа как обычное приложение винды, уж точно. |
Издержки современных паттернов работы с вебом: у среднего юзера открыта куча вкладок, на каждой из которых куча таймеров, выполняющих кучу бесполезной тяжёлой работы.
Особенно кстати тут отличаются spa, а конкретнее react.) |
Aetae,
не подскажешь а requestAnimationFrame тоже засыпает? если нет, может на нём таймер сделать? |
рони, он вообще останавливается. requestAnimationFrame(callback) - это по сути addEventListener('отрисовка фрейма', callback, { once: true }).
Если вкладка скрыта - там ничего не рисуется.) |
Aetae,
:thanks: |
Воркеры и WASM модули не засыпают но очень много ресурсов потребляют.
Можно переопределить setTimeout завернув его в воркер |
А думаете в этих замороженных вкладках может и время тоже тормозить?
Сделал проверку по Date.now() и вроде как не помогло. Проверяю метками что если прошло 5 минут, то... Они реально прошли, а эта проверка не сработала |
Цитата:
Комп за это время в спячку не уходит? А вообще, хотелось бы видеть хотя бы макет кода, что бы попытаться понять, что у вас происходит. |
Вот такой тест
<!DOCTYPE html> <html class=" "> <head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <body> <button id='but'>Start</button> <div id='res'></div> <script> const but = document.getElementById('but') const res = document.getElementById('res') const dt = 5*1000; let dtim let t0 const check = () => { let t = performance.now(); const dtim = new Date().toLocaleTimeString('ru') res.innerHTML += `<span style="color:${document.hidden?'blue':'red'}">${dtim} Check ${((t-t0)/1000).toFixed(2)}</span><br>`; t0 = t setTimeout (check, dt) } but.addEventListener('click', () => { t0 = performance.now(); const dtim = new Date().toLocaleTimeString('ru') res.innerHTML = `${dtim} Start<br>`; setTimeout (check, dt) }) </script> </body> </html> На Chrome у меня получается следующее Если dt - интервал устанавливаемый в setTimeout, то в неактивной вкладке он становится таким Первые 5 мин неактивности - dt + 1сек После 5 мин - max(dt, 60) + 1сек Если setTimeout вызван до 5 мин неактивности, а сработать функция должна после, то результирующий интервал получается каким то промежуточным, вероятно прибавляется не 60 сек, а пропорционально времени, превышающим 5 мин. |
Цитата:
Начальная временная метка - когда открылась страница с формой. Проверочная - та, когда обработчик setTimeout вызвался. Но вроде приняли мое решение, может они что то напутали с тем что мой последний вариант(где метки сравнивал) не работает. |
Часовой пояс GMT +3, время: 13:24. |