Javascript setTimeout ne permet pas un intervalle inférieur à 100 millisecondes

Je veux déclencher une fonction récursive toutes les 10 millisecondes, mais SetTimeout ne semble pas prendre de valeur inférieure à 100, peu importe ce que j'ai mis.

decrementCountdown = function() { console.log('fired'); t = setTimeout("decrementCountdown()", 100); } 

Pourquoi ne puis-je pas définir une valeur inférieure à 1000 millisecondes?

EDIT: On dirait que ma minuterie se lance correctement … le problème est quand je l'utilise pour appeler une fonction (comme le html () de Jquery). Même si setTimeout appelle la fonction à des intervalles corrects, il ne déclenchera pas plus rapidement que 100 millisecondes.

Quelqu'un sait-il comment je peux faire un compte à rebours sur ma page qui compte 10 millisecondes?

Un meilleur exemple est le suivant:

 var stop = 0; decrementCountdown = function() { console.log(new Date().getTime()); stop++; if (stop<10) t = setTimeout("decrementCountdown()", 100); } decrementCountdown(); 

Comme vous devriez le voir, le délai d'attente est déclenché à chaque 100 ms ( jsFiddle ).

J'ai essayé votre exemple et cela a bien fonctionné.

Pour ce qu'il vaut, je sauverais sur la redécouverte constante de setTimeout en utilisant

 function decrementCountdown() { /*Do your thing*/ } setInterval(decrementCountdown, 100); 

Voici une page que vous pouvez exécuter qui vous indiquera exactement quelles sont les variations pour setTimeout() dans votre navigateur sur votre système. Il exécute 10 000 opérations setTimeout(fn, 1) et enregistre la latence moyenne, max et min entre les appels et les sorties à l'écran.

setTimeout() a une valeur minimale qu'il honorera. Il varie un peu par le navigateur, mais il est typiquement dans la gamme de 10 à 20 ms (bien qu'il puisse être plus petit ou plus grand – c'est au navigateur). C'est ce qu'on appelle "serrage". Son but est de protéger la file d'attente de l'événement du navigateur de trop d'exécution javascript et pas assez de temps pour faire d'autres choses (comme le service d'autres événements utilisateur, les repeint, etc.).

Mais, cela signifie seulement que le navigateur ne déclenchera pas plus tôt que cette valeur minimale, cela ne signifie pas que vous en recevrez toujours un rapidement. Javascript est simple thread, donc si le navigateur est occupé, setTimeout() ne se produira que s'il n'y a plus d'exécution javascript et que l'événement de la minuterie suivante arrive à l'avant de la file d'attente.

En outre, les horaires ralentissent dans certains navigateurs modernes, lorsque la page avec la minuterie n'est pas l'onglet actuel. Vous pouvez le voir dans la page ci-dessus en basculant vers un autre onglet pendant son fonctionnement et voir que vous obtenez un temps plus lent.

Pour ceux qui sont curieux, voici le code de cette page:

 var lastTime = new Date(); var cumDiff = 0; var minDelta = 1000000; var maxDelta = 0; var cnt = 0; var nowElem = document.getElementById("now"); var deltaElem = document.getElementById("delta"); var minDeltaElem = document.getElementById("minDelta"); var maxDeltaElem = document.getElementById("maxDelta"); function run() { var now = new Date().getTime(); var diff = now - lastTime; cumDiff += diff; minDelta = Math.min(diff, minDelta); maxDelta = Math.max(diff, maxDelta); cnt++; var avgDelta = cumDiff / cnt; lastTime = now; nowElem.innerHTML = now; deltaElem.innerHTML = avgDelta.toFixed(1); minDeltaElem.innerHTML = minDelta; maxDeltaElem.innerHTML = maxDelta; if (cnt < 10000) { setTimeout(run, 1); } } setTimeout(run, 1); 

Disclaimer: certains navigateurs plus anciens ne disposent pas de fonctions Date() précises (seulement exactes dans les 10 à 20 ms), de sorte que ces données ne seront pas très précises dans l'un de ces anciens navigateurs.