Maison >interface Web >js tutoriel >Comment puis-je créer des minuteries précises en JavaScript ?

Comment puis-je créer des minuteries précises en JavaScript ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-25 07:19:33157parcourir

How Can I Create Accurate Timers in JavaScript?

Création de minuteries précises en JavaScript

Déterminer des intervalles de temps précis en JavaScript peut être difficile en raison de la nature imprécise de setTimeout() et setInterval( ).

Inexactitude de setTimeout() et setInterval()

setTimeout() et setInterval() s'appuient sur les mécanismes de planification du navigateur, qui peuvent être influencés par les ressources système et l'activité du navigateur. Cette variabilité inhérente peut conduire à des incohérences et à un timing peu fiable, comme le démontre l'exemple donné.

Solution : Utiliser l'objet Date

Pour créer des minuteries précises, envisagez d'utiliser l'objet Date. La méthode now() de l'objet pour récupérer l'horodatage actuel en millisecondes. Cette approche offre une meilleure précision par rapport aux méthodes basées sur le rappel.

Implémentation simple de la minuterie :

Pour les scénarios de synchronisation de base, vous pouvez suivre explicitement le décalage horaire en utilisant l'approche suivante :

var start = Date.now();
setInterval(function() {
    var delta = Date.now() - start; // milliseconds since start
    ...
    output(Math.floor(delta / 1000)); // in seconds
}, 1000);

Cette méthode suit le décalage horaire depuis le début du chronomètre. Pour éviter les sauts de valeur potentiels, il est recommandé de mettre à jour l'intervalle plus fréquemment (par exemple toutes les 100 ms).

Minuteries auto-ajustables

Pour des intervalles précis et sans dérive, vous pouvez mettre en œuvre des minuteries auto-ajustables. Ces minuteries adaptent le délai pour chaque expiration répétée en fonction du temps réellement écoulé :

var interval = 1000; // ms
var expected = Date.now() + interval;
setTimeout(step, interval);
function step() {
    var dt = Date.now() - expected; // drift
    ...
    expected += interval;
    setTimeout(step, Math.max(0, interval - dt)); // adjust delay for drift
}

Cette approche surveille la dérive temporelle et compense toute incohérence, garantissant une cadence de synchronisation plus précise.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn