¿Cómo usar setInterval y 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;
    }
}

Hola a todos,

Quiero llamar drawAll()una vez sin crear un ciclo que llame drawAlluna y otra vez, ¿debería usar un método recursivo para eso o debería usarlo clearInterval?

También por favor dime que use clearInterval? Gracias :)

Raj
fuente

Respuestas:

210

setIntervalconfigura un temporizador recurrente . Devuelve un identificador que puede pasar clearIntervalpara evitar que se dispare:

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

En los navegadores, se garantiza que el identificador sea un número que no sea igual a 0; por lo tanto, 0hace un valor de indicador útil para "sin temporizador establecido". (Otras plataformas pueden devolver otros valores; las funciones de temporizador de NodeJS devuelven un objeto, por ejemplo).

Para programar una función para que solo se active una vez, use setTimeouten su lugar. No seguirá disparando. (También devuelve un identificador que puede usar para cancelarlo clearTimeoutantes de que se active una vez, si corresponde).

setTimeout(drawAll, 20);
TJ Crowder
fuente
29

clearInterval es una opción:

var interval = setInterval(doStuff, 2000); // 2000 ms = start after 2sec 
function doStuff() {
  alert('this is a 2 second warning');
  clearInterval(interval);
}
Joshua - Pendo
fuente
77
Nunca use cuerdas con setIntervalo setTimeout.
TJ Crowder
1
quieres decir que debería eliminar las comillas que rodean a doStuff ()?
Joshua - Pendo
9
Sí, tanto las citas como los parens. Simplemente: setInterval(doStuff);. Pasar una cadena setIntervales una llamada implícita a eval. Es mejor pasar la referencia de función en su lugar.
TJ Crowder
1
Ah, bueno, el voto negativo quizás sea justo ... Mostré un ejemplo que no es correcto (aunque funciona en mis casos, pero estoy cambiando esto mientras hablamos). ¡Pulgares hacia arriba! :)
Joshua - Pendo
10

Usar en su setTimeout(drawAll, 20)lugar. Eso solo ejecuta la función una vez.

dlev
fuente
Muchas gracias, pero setTimeout está terminando el ciclo en cada punto, utilizo otro enfoque y funciona bien, la función doKeyDown (event) {switch (event.keyCode) {case 32: / * Se presionó la barra espaciadora * / loop = setInterval (drawAll, 20); if (x == 202) {x = 400; hilandero(); } rotura; }}
Raj
no era la pregunta aunque
Nino Škopac
8

Solía ​​angular con electrón,

En mi caso, setIntervaldevuelve un objeto Nodejs Timer. que cuando llaméclearInterval(timerobject) no funcionó.

Primero tenía que obtener la identificación y llamar a clearInterval

clearInterval(timerobject._id)

He luchado muchas horas con esto. espero que esto ayude.

PJ3
fuente
5

Nota al margen: si desea utilizar funciones separadas para establecer y borrar el intervalo, la variable de intervalo debe ser accesible para todos ellos, en el ámbito 'relativo global' o 'un nivel superior':

var interval = null;    

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

function stopStuff() {
    clearInterval(interval);
}
HynekS
fuente