Por que meu Settimeout acelera quando tenho várias guias abertas para o meu site?
-
18-09-2019 - |
Pergunta
Eu tenho um cronômetro que conta a cada segundo. Funciona muito bem até que o usuário abre 3 ou 4 guias do meu site; nesse momento, o timer do mais recente guia é dobrado ou triplo. Atualmente, só posso reproduzir o bug no IE8. Eu já estava usando o SetInterval e também poderia reproduzir o bug no Firefox.
Na verdade, estou usando o FBJS (JavaScript do Facebook), então vou dar um pouco de pseudocódigo.
function countDown() {
...
setTimeout(function() { countDown() }, 1000);
}
countDown();
No entanto, o que realmente estou procurando é mais teórico. Eu sei que os navegadores podem tentar jogar "Catch Up" com o SetInterval, mas como várias guias podem causar esse comportamento para o Settimeout?
Solução
Toda essa situação é muito estranha. O único cenário que vem à mente onde faz algum sentido é aquele em que o navegador está tentando "suavizar" o período de auto-reinstalação Settimeouts, o mesmo que para o setInterval, e o código que está fazendo isso realmente confunde timers em janelas diferentes com cada um com cada um outro.
Não sei se é viável, especialmente com o Facebook envolvido, mas um teste interessante seria dar a cada instância um nome randomizado para o countDown
Funcionar e veja se isso faz alguma diferença, como:
<?php $timerTag = rand(1, 1000); ?>
function countDown<?php echo $timerTag ?>() {
...
setTimeout(function() { countDown<? php echo $timerTag ?>() }, 1000);
}
countDown<?php echo $timerTag ?>();
Se isso mudar o comportamento observado, isso defende o cenário que tenho em mente. (E possivelmente fornece uma maneira de resolver o problema.)