Come usare setInterval e clearInterval?


138
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;
    }
}

Ciao a tutti,

Voglio chiamare drawAll()una volta non creando un loop che chiama drawAllancora e ancora, dovrei usare il metodo ricorsivo per quello o dovrei usare clearInterval?

Inoltre per favore dimmi di usare clearInterval? Grazie :)

Risposte:


210

setIntervalimposta un timer ricorrente . Restituisce un handle in cui puoi passare clearIntervalper impedirne lo sparo:

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

Sui browser, l'handle è garantito per essere un numero diverso da 0; pertanto, 0rende utile un valore di flag per "nessun timer impostato". (Altre piattaforme possono restituire altri valori; le funzioni timer di NodeJS restituiscono un oggetto, ad esempio.)

Per programmare una funzione da attivare una sola volta, utilizzare setTimeoutinvece. Non continuerà a sparare. (Restituisce anche un handle che è possibile utilizzare per annullarlo clearTimeoutprima di sparare una volta, se appropriato.)

setTimeout(drawAll, 20);

29

clearInterval è un'opzione:

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

7
Non usare mai stringhe con setIntervalo setTimeout.
TJ Crowder,

1
vuoi dire che dovrei rimuovere le virgolette che circondano doStuff ()?
Giosuè - Pendo,

9
Sì, sia le virgolette che le parentesi. Semplicemente: setInterval(doStuff);. Passare una stringa in setIntervalè una chiamata implicita a eval. Meglio passare invece al riferimento di funzione .
TJ Crowder,

1
Ah bene, il downvote forse è giusto .. Ho mostrato un esempio che non è corretto (anche se funziona nei miei casi, ma sto cambiando questi mentre parliamo). Pollice su! :)
Giosuè - Pendo,

10

Usa setTimeout(drawAll, 20)invece. Questo esegue la funzione solo una volta.


Grazie mille, ma setTimeout sta finendo il ciclo in ogni punto, uso un altro approccio e funziona bene, funzione doKeyDown (event) {switch (event.keyCode) {case 32: / * La barra spaziatrice è stata premuta * / loop = setInterval (drawAll, 20); if (x == 202) {x = 400; filatore (); } rompere; }}
Raj,

non era la domanda però
Nino Škopac,

8

Ho usato angolare con l'elettrone,

Nel mio caso, setIntervalrestituisce un oggetto Timer Nodejs. che quando ho chiamato clearInterval(timerobject)non ha funzionato.

Ho dovuto prima ottenere l'id e chiamare per cancellareInterval

clearInterval(timerobject._id)

Ho lottato molte ore con questo. spero che questo ti aiuti.


5

Nota a margine: se si desidera utilizzare funzioni separate per impostare e cancellare l'intervallo, la variabile intervallo deve essere accessibile per tutti, nell'ambito 'relativo globale' o 'a un livello superiore':

var interval = null;    

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

function stopStuff() {
    clearInterval(interval);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.