setInterval est mal foutu, mais on a une solution...

JavaScript

...encore heureux !

Mais comment ça, une fonction de Javascript est mal foutue ? Pour un langage pareil, ce serait vraiment étonnant. *tousse*

Prenons un exemple simple : vous avez une fonction à exécuter toutes les x millisecondes, pour faire une opération du style compte à rebours.

Vous aurez donc l’initiative d’utiliser setInterval - ce qui n'est pas une mauvaise intuition. Le problème de ce dernier étant juste que, au bout d’un moment, il se peut qu’il prenne du retard à exécuter la fonction demandée, et il y a donc une latence. C’est plutôt gênant si vous avez besoin que votre fonction soit appelée à une intervalle strictement égale au fil du temps.

Ma réaction quand j'ai découvert l'incroyable vérité derrière setInterval

L’astuce pour régler ce problème est donc d’utiliser un setTimeout en se basant sur new Date.now() : on exécute la fonction dans x millisecondes, mais si besoin, on retire des millisecondes de retard à ces x millisecondes.

Et pour vous éviter de coder ça vous-même, la bibliothèque Tock implémente cette technique avec en bonus quelques options supplémentaires par rapport à un simple setInterval.

Tout se trouve sur la page de son dépôt GitHub, et c'est tout sauf difficile à utiliser. Voilà un exemple de fonction appelée exactement toutes les 1000 millisecondes :

on jsbin.com