2009-12-29 4 views
11

Comment setInterval gère-t-il les fonctions de rappel qui prennent plus de temps que l'intervalle souhaité? J'ai lu que le rappel peut recevoir le nombre de millisecondes en retard comme premier argument, mais je n'ai pas pu trouver pourquoi il serait en retard (jitter, ou fonctions de longue durée).setInterval et fonctions d'exécution longues

Et le merveilleux suivi, se comporte-t-il différemment pour les navigateurs courants?

+0

Bonne question. Je suppose que la réponse est spécifique au navigateur. Devrions-nous faire des tests pour le savoir? –

+0

Je ne compterais pas sur recevoir des arguments au rappel. Au lieu de cela, utilisez une simple comparaison de date. Cela semble être l'approche la plus fiable et la plus répandue parmi les navigateurs. –

Répondre

14

Permettez-moi de citer un excellent article sur les minuteries par John Resig:

setTimeout(function(){ 
    /* Some long block of code... */ 
    setTimeout(arguments.callee, 10); 
}, 10); 

setInterval(function(){ 
    /* Some long block of code... */ 
}, 10); 

Ces deux morceaux de code peuvent sembler être fonctionnellement équivalent, au premier coup d'œil , mais ils ne sont pas. Notamment le code setTimeout aura toujours à moins un retard de 10 ms après l'exécution de rappel précédente (il peut finir par être plus, mais jamais moins), alors que le setInterval tentera de exécuter un rappel tous les 10ms peu importe le moment le dernier rappel a été exécuté.

Les intervalles peuvent s'exécuter dos à dos sans délai s'ils sont suffisamment longs pour être exécutés (plus longtemps que le délai spécifié).

+4

Donc, en un mot, parce que le thread JavaScript est tous thread unique, les callbacks ne peuvent pas fonctionner en parallèle. Parfait. –