2010-11-19 7 views
1

le .defer(5000) provoque une erreur too much recursion en JavaScript. Comment puis-je retarder l'exécution de 5 secondes?Comment faire pour retarder en JavaScript

rotate: function() { 
    if (!paused) { 
    this.show(counter); 

    counter = counter + 1; 

    if (counter === Spire.Rotator.data.items.length) { 
     counter = 0; 
    } 

    Spire.Rotator.rotate().defer(5000); 
    //$.proxy(Spire.Rotator.rotate, Spire.Rotator).defer(delay); 
    } 
} 

Répondre

5

Cette ligne entière:

Spire.Rotator.rotate().defer(5000); 

est erroné. À cause des parenthèses juste après rotate, votre fonction s'appelle immédiatement encore et encore (récursion infinie). Retrait des parenthèses va résoudre ce problème, mais le code ne fonctionnera probablement pas. Pour corriger le code, utilisez window.setTimeout method du navigateur qui accepte une fonction et un délai (en millisecondes) que deux arguments:

setTimeout(function() { 
    Spire.Rotator.rotate(); 
}, 5000); 

Pourquoi ne pas simplement setTimeout(Spire.Rotator.rotate, 5000);? La raison en est que this dans cette fonction serait window plutôt que Spire.Rotator. (Il ya plenty of information sur Internet à ce sujet.) Pourquoi pas setTimeout("Spire.Rotator.rotate()", 5000);? C'est une façon assez datée (déconseillée) d'utiliser la méthode qui souffre du même pitfalls of eval, une fonction que certains programmeurs JavaScript, dont Douglas Crockford, ne recommandent pas.

3

Il suffit de remplacer ceci:

Spire.Rotator.rotate().defer(5000); 

Avec ceci:

setTimeout(Spire.Rotator.rotate, 5000); 

setTimeout() est de manière native de javascript d'exécuter un code Javascript après un certain laps de temps.

+0

N'utilisez pas de chaînes comme paramètre de setTimeout. C'est valable mais enclin à citer l'enfer et est également lent. Utilisez une fonction à la place: 'setTimeout (Spire.Rotator.rotate, 5000)' – slebetman

+0

@slebetman Ah! Oui bien sûr. Merci pour le rappel. :) – Alex

3

En fait, dans votre code, defer() n'est jamais appelé. En supposant que la méthode rotate vous définissez est pour l'objet Spire.Rotator ce qui se passe est:

rotate() calls rotate() calls rotate() calls rotate() .... [to infinity] 

Après infinity nombre d'appels à la valeur de retour de l'appel infinitieth appellera alors la méthode defer. Mais vous devez attendre que les appels infinity se produisent, ce qui prend eternity secondes à compléter.

Ce dont vous avez besoin est setTimeout().

Questions connexes