Question

Ceci est une question assez simple, vraiment. Si j'utilise setInterval(something, 1000), je peux être complètement sûr qu'après, disons, 31 jours il aura déclenché « quelque chose » fois exactement 60*60*24*31? Ou est-il un risque pour que l'on appelle la dérive?

Était-ce utile?

La solution

Voici un point de repère que vous pouvez exécuter dans Firefox:

var start = +new Date();
var count = 0;
setInterval(function () {
    console.log((new Date() - start) % 1000,
    ++count,
    Math.round((new Date() - start)/1000))
}, 1000);

La première valeur doit être aussi proche de 0 ou 1000 que possible (toute autre valeur montre comment « hors place » le moment du déclenchement a été.) La seconde valeur est le nombre de fois que le code a été déclenché, et la troisième valeur est combien de fois pourrait devrait ont été déclenchées. Vous remarquerez que si vous HOG votre CPU, il peut être assez large place, mais il semble se corriger. Essayez de l'utiliser pour une plus longue période de temps et de voir comment il gère.

Autres conseils

Réponse courte: Non, vous ne pouvez pas être sûr. Oui, il peut dériver.

Réponse longue: John Resig sur le et < a href = "http://ejohn.org/blog/how-javascript-timers-work/" rel = "noreferrer"> Comment travail JavaScript Timers.

À partir du deuxième article:

  

Pour comprendre comment les minuteries fonctionnent à l'intérieur il y a un concept important qui doit être explorée: délai de temporisation est pas garantie. Comme tous JavaScript dans un navigateur exécute sur un seul événements asynchrones de fil (comme les clics de souris et minuteurs) sont exécutés uniquement quand il y a eu une ouverture dans l'exécution.

Les deux articles (et quoi que ce soit sur ce site) est une grande lecture, ont donc à elle.

(Désolé mon mauvais anglais) J'ai eu même problème à propos de décompter fonction, i writed un compte à rebours de la fonction () et la boucle avec setInterval mais sa dérive 1-3 millisecondes par boucle. Puis-je écrire une fonction qui contrôle est-il dérivantes et le fixe.

Il contrôle avec une réelle minute et seconde seulement. C'est ici. Ses œuvres bien pour moi, j'espère que cela vous aidera aussi.

$.syncInterval(functionname,interval,controlinterval)

exemple:

countdown(){ some code };
$.syncInterval(countdown,1000,60);

il est dit fonction d'exécution du compte à rebours 1000 millisecondes et vérifier toutes les 60 secondes

Voici le code:

$.syncInterval = function (func,interval,control) { 
        var 
        now=new Date();
        realMinute=now.getMinutes(),
        realSecond=now.getSeconds(),
        nowSecond=realSecond,
        nowMinute=realMinute,
        minuteError=0,
        countingVar=1,
        totalDiff=0;

        var loopthat = setInterval(function(){

        if (nowSecond==0) {
            nowMinute++;
            nowMinute=nowMinute%60;
        };
        if (countingVar==0){

            now=new Date();
            realSecond=now.getSeconds();
            realMinute=now.getMinutes();

            totalDiff=((realMinute*60)+(realSecond))-((nowMinute*60)+(nowSecond));
            if(totalDiff>0){
                for (i=1;i<=totalDiff;i++) {
                    func();
                    nowSecond++;
                    countingVar++;
                };
            } else if (totalDiff==0){
                func();
                nowSecond++;
                countingVar++;
            } else if (totalDiff<0) {

            };
        } else {
            func();
            nowSecond++;
            countingVar++;
        };
        countingVar=countingVar%control;
        nowSecond=nowSecond%60;
    },interval);
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top