1646 votes

Arrêtez l'appel setInterval en JavaScript

Je utilise setInterval(fname, 10000); pour appeler une fonction toutes les 10 secondes en JavaScript. Est-il possible de cesser cet appel sur un certain événement?

Je veux que l'utilisateur soit capable d'arrêter le rafraîchissement répété de données.

2529voto

John Millikin Points 86775

setInterval() renvoie un ID d'intervalle, que vous pouvez passer à clearInterval() :

var refreshIntervalId = setInterval(fname, 10000);

/* plus tard */
clearInterval(refreshIntervalId);

Consultez la documentation de setInterval() et clearInterval().

55 votes

Comment pouvez-vous le démarrer à nouveau après l'avoir arrêté avec 'clearInterval()' ? Si j'essaie de le redémarrer, j'obtiens 2x le setInterval en cours d'exécution.

11 votes

Moi aussi À chaque fois que je veux utiliser SetInterval(MyFunction , 4000); cela devient de plus en plus rapide, chaque fois 2x plus rapide :( comment puis-je redémarrer un setinterval ??

17 votes

SetInterval() ne change pas la vitesse que vous lui passez. Si ce qu'il fait s'accélère à chaque fois que vous appelez SetInterval(), alors vous avez plusieurs minuteurs qui fonctionnent en même temps et devriez poser une nouvelle question.

125voto

Quintin Robinson Points 41988

Si vous définissez la valeur de retour de setInterval dans une variable, vous pouvez utiliser clearInterval pour l'arrêter.

var myTimer = setInterval(...);
clearInterval(myTimer);

4 votes

Je ne vois pas la différence entre ceci et la réponse de John

0 votes

Tardif mais, je pense que c'est copié avec quelques différences de mots rien de plus clair que la réponse de John

0 votes

Réponse SPAM....

63voto

OMGrant Points 303

Vous pouvez définir une nouvelle variable et l'incrémenter de ++ (ajouter un) à chaque fois qu'elle s'exécute, puis j'utilise une déclaration conditionnelle pour y mettre fin :

var intervalId = null;
var varCounter = 0;
var varName = function(){
     if(varCounter <= 10) {
          varCounter++;
          /* votre code va ici */
     } else {
          clearInterval(intervalId);
     }
};

$(document).ready(function(){
     intervalId = setInterval(varName, 10000);
});

J'espère que cela vous aide et est correct.

4 votes

J'ai été surpris d'apprendre que cela fonctionne clearInterval(varName);. Je m'attendais à ce que clearInterval ne fonctionne pas lorsque le nom de la fonction est passé, je pensais que l'ID de l'intervalle était requis. Je suppose que cela ne peut fonctionner que si vous avez une fonction nommée, car vous ne pouvez pas passer une fonction anonyme en tant que variable à l'intérieur d'elle-même.

34 votes

En réalité, je pense que cela ne fonctionne pas. Le code cesse d'être exécuté en raison de la restriction sur le compteur, mais l'intervalle continue de déclencher varName(). Essayez de consigner n'importe quoi après clearInterval() (à l'intérieur de la clause else) et vous verrez que cela s'écrit pour toujours.

7 votes

Tant de votes positifs pour quelque chose qui ne fonctionne pas, parfois je ne comprends pas les gens sur SO :P

14voto

Schien Points 1224

Les réponses ci-dessus ont déjà expliqué comment setInterval renvoie une poignée, et comment cette poignée est utilisée pour annuler le minuteur Interval.

Certaines considérations architecturales:

Veuillez ne pas utiliser de variables "sans portée". Le moyen le plus sûr est d'utiliser l'attribut d'un objet DOM. L'endroit le plus facile serait "document". Si le rafraîchisseur est lancé par un bouton start/stop, vous pouvez utiliser le bouton lui-même:

Start

function start(d){
    if (d.interval){
        clearInterval(d.interval);
        d.innerHTML='Start';
    } else {
        d.interval=setInterval(function(){
          //actualiser ici
        },10000);
        d.innerHTML='Stop';
    }
}

Étant donné que la fonction est définie à l'intérieur du gestionnaire de clic sur le bouton, vous n'avez pas à la redéfinir. Le minuterie peut être reprise si le bouton est à nouveau cliqué.

1 votes

Qu'est-ce qui est mieux à propos de le mettre sur document que sur window?

1 votes

Correction. Je voulais dire document.body. Dans mon exemple de code, j'utilise effectivement le bouton lui-même. Il n'y a pas d'identifiant pour le bouton, mais le pointeur "this" est lié au paramètre "d" dans la fonction. Utiliser "window" comme portée est risqué car les fonctions s'y trouvent également. Par exemple, "function test(){}" est accessible via window.test, ce qui revient au même que de ne pas utiliser de portée du tout, car c'est un raccourci. J'espère que cela vous aide.

1 votes

Ne perdez pas les variables "sans portée" -> n'utilisez pas "sans portée". J'aurais modifié cela, mais le changement est inférieur à 6 lettres, et l'erreur est déroutante.

12voto

Onur Yıldırım Points 5566

Déjà répondu... Mais si vous avez besoin d'un minuteur en vedette, réutilisable qui prend également en charge plusieurs tâches à des intervalles différents, vous pouvez utiliser mon TaskTimer (pour Node et navigateur).

// Minuteur avec une résolution d'intervalle de base de 1000 ms (1 seconde).
const timer = new TaskTimer(1000);

// Ajouter des tâches basées sur des intervalles de tick.
timer.add({
    id: 'job1',         // identifiant unique de la tâche
    tickInterval: 5,    // s'exécute tous les 5 ticks (5 x intervalle = 5000 ms)
    totalRuns: 10,      // s'exécute 10 fois seulement. (omettre pour un nombre illimité de fois)
    callback(task) {
        // code à exécuter à chaque exécution
        console.log(task.name + ' la tâche a été exécutée ' + task.currentRuns + ' fois.');
        // arrêter le minuteur à tout moment
        if (someCondition()) timer.stop();
        // ou simplement supprimer cette tâche si vous en avez d'autres
        if (someCondition()) timer.remove(task.id);
    }
});

// Démarrer le minuteur
timer.start();

Dans votre cas, lorsque les utilisateurs cliquent pour perturber le rafraîchissement des données; vous pouvez également appeler timer.pause() puis timer.resume() s'ils ont besoin de réactiver.

Voir plus ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X