191 votes

Comment utiliser setInterval et clearInterval ?

function doKeyDown(event) {
    switch (event.keyCode) {
    case 32:
        /* Space bar was pressed */
        if (x == 4) {
            setInterval(drawAll, 20);
        }
        else {
            setInterval(drawAll, 20);
            x += dx;
        }
        break;
    }
}

Bonjour à tous,

Je veux appeler drawAll() une fois ne pas créer un boucle cet appel drawAll encore et encore, dois-je utiliser une méthode récursive pour cela ou dois-je utiliser clearInterval ?

Veuillez également me dire d'utiliser clearInterval ? Merci :)

287voto

T.J. Crowder Points 285826

setInterval met en place un récurrent timer. Il retourne un handle que vous pouvez passer dans clearInterval pour l'empêcher de tirer :

var handle = setInterval(drawAll, 20);

// When you want to cancel it:
clearInterval(handle);
handle = 0; // I just do this so I know I've cleared the interval

Sur les navigateurs, il est garanti que le handle est un nombre qui n'est pas égal à 0 donc, 0 est une valeur de drapeau pratique pour "no timer set". (D'autres plateformes peuvent renvoyer d'autres valeurs ; les fonctions timer de NodeJS renvoient un objet, par exemple).

Pour programmer une fonction à uniquement tirer une fois, utiliser setTimeout à la place. Il ne continuera pas à tirer. (Elle renvoie également un identifiant que vous pouvez utiliser pour l'annuler via la fonction clearTimeout avant qu'il ne se déclenche une seule fois, le cas échéant).

setTimeout(drawAll, 20);

44voto

Joshua - Pendo Points 1506

clearInterval est une option :

var interval = setInterval(doStuff, 2000); // 2000 ms = start after 2sec 
function doStuff() {
  alert('this is a 2 second warning');
  clearInterval(interval);
}

8 votes

N'utilisez jamais de cordes avec setInterval o setTimeout .

1 votes

Vous voulez dire que je dois supprimer les guillemets qui entourent doStuff() ?

10 votes

Oui, à la fois les guillemets et les parenthèses. Tout simplement : setInterval(doStuff); . Passage d'une chaîne de caractères dans setInterval est un appel implicite à eval . Le mieux est de passer dans la fonction référence à la place.

17voto

HynekS Points 472

Remarque : si vous souhaitez utiliser des fonctions distinctes pour définir et effacer l'intervalle, la variable d'intervalle doit être accessible pour toutes ces fonctions, dans une portée "globale relative" ou "un niveau au-dessus" :

var interval = null;    

function startStuff(func, time) {
    interval = setInterval(func, time);
}

function stopStuff() {
    clearInterval(interval);
}

12voto

user3333933 Points 11

J'ai utilisé angular avec electron,

Dans mon cas, setInterval renvoie un objet Nodejs Timer, qui lorsque j'ai appelé clearInterval(timerobject) cela n'a pas fonctionné.

Je devais d'abord récupérer l'id et appeler clearInterval.

clearInterval(timerobject._id)

J'ai passé de nombreuses heures à me débattre avec ce problème. J'espère que cela vous aidera.

9voto

dlev Points 28160

Utilisez setTimeout(drawAll, 20) à la place. Cela n'exécute la fonction qu'une seule fois.

0 votes

Merci beaucoup, mais setTimeout termine la boucle à chaque point, j'utilise une autre approche et cela fonctionne bien, function doKeyDown(event) { switch (event.keyCode) { case 32 : /* La barre d'espacement a été pressée */ loop = setInterval(drawAll, 20) ; if (x == 202) { x = 400 ; spinner() ; } break ; } } }

0 votes

Ce n'était pas la question.

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