Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   бажит setTimeout в неактивной вкладке в Chrome (https://javascript.ru/forum/css-html/83013-bazhit-settimeout-v-neaktivnojj-vkladke-v-chrome.html)

micscr 27.08.2021 09:45

бажит setTimeout в неактивной вкладке в Chrome
 
Приветствую.
Мне рапортуют баг в моем приложении, но сам я его не могу повторить, речь идет о Chrome на виндовс.
Стоит обычный код, через 5 минут проверка на "неактивность":
setTimeout(check, 300000);

, но у них получается он :
- открывает форму, отсчет пошел.
- переходит на другие вкладки
- эта проверка происходит в реалии только через 8 минут

Гуглил про какие то оптимизации в неактивных вкладках, когда setInterval на 1 сек переводится,
но чтобы такое...

Встречали и как такое фиксить?
Может банально можно таймер установить работать правильно?

voraa 27.08.2021 10:10

С Chrome 88+ интервал увеличивается до 1 мин, если вкладка неактивна больше 5 мин.
https://usefulangle.com/web-updates/...imers-1-minute
https://developer.chrome.com/blog/ti...-in-chrome-88/

micscr 27.08.2021 10:23

Ну у меня вроде ж как и не интервал это.
Неужто оно как то прибавляет к моему еще что то за неактивность?

Aetae 27.08.2021 11:27

Он вообще может отрубить все интервалы и таймауты на неактивной вкладке.

Был хак для сохранения вкладки активной - проигрывание тишины в audio. Но теперь он не поможет, т.к. автозапуск аудио запретили(правильно сделали, впрочем).

Как сейчас с этим справляются - хз, я не трогаю неактивные вкладки.)

P.S. setTimeout в любом случае ничего не гарантирует. Указанное время задержки означает "не раньше чем".

micscr 27.08.2021 13:51

Буду наверное сам считать метки времени и разницу, реально прошедшую.
Странно выглядит "замирание" страницы при неактивной вкладке.
В современном SPA приложении( у меня не оно), которое типа как обычное приложение винды, уж точно.

Aetae 27.08.2021 15:15

Издержки современных паттернов работы с вебом: у среднего юзера открыта куча вкладок, на каждой из которых куча таймеров, выполняющих кучу бесполезной тяжёлой работы.

Особенно кстати тут отличаются spa, а конкретнее react.)

рони 27.08.2021 15:34

Aetae,
не подскажешь а requestAnimationFrame тоже засыпает? если нет, может на нём таймер сделать?

Aetae 27.08.2021 16:02

рони, он вообще останавливается. requestAnimationFrame(callback) - это по сути addEventListener('отрисовка фрейма', callback, { once: true }).
Если вкладка скрыта - там ничего не рисуется.)

рони 27.08.2021 16:06

Aetae,
:thanks:

MallSerg 28.08.2021 02:17

Воркеры и WASM модули не засыпают но очень много ресурсов потребляют.
Можно переопределить setTimeout завернув его в воркер

micscr 30.08.2021 10:58

А думаете в этих замороженных вкладках может и время тоже тормозить?
Сделал проверку по Date.now() и вроде как не помогло.
Проверяю метками что если прошло 5 минут, то...
Они реально прошли, а эта проверка не сработала

voraa 30.08.2021 13:46

Цитата:

Сообщение от micscr
Проверяю метками что если прошло 5 минут, то...

А как проверяете, когда вкладка закрыта?
Комп за это время в спячку не уходит?

А вообще, хотелось бы видеть хотя бы макет кода, что бы попытаться понять, что у вас происходит.

voraa 30.08.2021 14:45

Вот такой тест
<!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 мин.

micscr 30.08.2021 15:14

Цитата:

Сообщение от voraa (Сообщение 539859)
А как проверяете, когда вкладка закрыта?

Я этого не проверяю.
Начальная временная метка - когда открылась страница с формой.
Проверочная - та, когда обработчик setTimeout вызвался.

Но вроде приняли мое решение, может они что то напутали с тем что мой последний вариант(где метки сравнивал) не работает.


Часовой пояс GMT +3, время: 13:24.