web-dev-qa-db-fra.com

Comment puis-je désactiver tous les événements setTimeout?

J'utilise ajax et asp.net. J'ai une fonction javascript qui crée de nombreuses autres fonctions javascript avec setTimeout. Après la publication asynchrone, je souhaite désactiver tous ces événements setTimeouted. Comment puis je faire ça?

50
MonsterMMORPG

Lorsque vous appelez setTimeout(), stockez l'ID du minuteur pour pouvoir l'effacer. Si vous créez de nombreux délais d'expiration, un tableau est une bonne option pour stocker les ID. Par exemple:

var timeouts = [];
//then, store when you create them
timeouts.Push( setTimeout( { ... }, 1000) );

Ensuite, lorsque vous souhaitez les effacer:

for (var i = 0; i < timeouts.length; i++) {
    clearTimeout(timeouts[i]);
}
//quick reset of the timer array you just cleared
timeouts = [];

Comme @ Robert noté ci-dessous, clearTimeout() ne générera pas d'erreur si le délai s'est déjà produit, il n'y a donc pas de problème de race/timing ici.

100
Nick Craver

Si vous ne pouvez pas accéder au code où la minuterie est réglée, la réponse de Nick peut ne pas fonctionner, alors tout ce à quoi je peux penser est ce hack.

C'est un hack, à utiliser avec prudence!

// Set a fake timeout to get the highest timeout id
var highestTimeoutId = setTimeout(";");
for (var i = 0 ; i < highestTimeoutId ; i++) {
    clearTimeout(i); 
}

Fondamentalement, il saisit l'ID de minuterie le plus élevé et efface tout moins que cela. Mais il est également possible d'effacer d'autres temporisateurs que vous ne voulez pas effacer!

106
SeanDowney

Je ne sais pas si vous pouvez le faire globalement, mais la méthode la plus courante consiste à utiliser clearTimeout . Vous transmettez la valeur de retour de setTimeout () à clearTimeout (), vous pouvez utiliser une variable globale pour stocker toutes les variables de délai d'expiration.

4
Robin

Tout d'abord, j'utilisais ce code:

var x = setTimeout('');
for (var i = 0; i < x; i++)
    clearTimeout(x);

Cependant, cette paix de code n'a pas fonctionné sur Google Chrome. J'ai donc fait des améliorations pour cela:

var x = setTimeout('alert("x");',100000); //It is very low probability that after 100 seconds x timeout will not be cleared
for (var i = 0; i <= x; i++)
    clearTimeout(i);

Enfin, c'est un hack, comme cela a été mentionné dans le commentaire ci-dessus, alors utilisez-le soigneusement.

Edit: correction d'une variable incorrecte utilisée dans la boucle (utilisez i au lieu de x)

3