web-dev-qa-db-fra.com

Fonction Javascript setInterval pour se vider?

myInterval = setInterval(function(){
     MyFunction();
},50);

function MyFunction()
{
    //Can I call clearInterval(myInterval); in here?
}

L'intervalle ne s'arrête pas (n'est pas effacé), si ce que j'ai codé ci-dessus est correct, cela m'aidera à chercher ailleurs la cause du problème. Merci.

EDIT: Supposons qu'il se termine quelques intervalles avant que clearInterval soit appelé, ce qui supprime le besoin de setTimeout.

52
user1017882

Tant que vous avez la portée de la variable interval enregistrée, vous pouvez l'annuler de n'importe où.

Dans un périmètre "enfant":

var myInterval = setInterval(function(){
     clearInterval(myInterval);
},50);

Dans une portée "frère":

var myInterval = setInterval(function(){
     foo();
},50);

var foo = function () {
    clearInterval(myInterval);
};

Vous pourriez même passer l'intervalle s'il sortait du cadre:

var someScope = function () {
    var myInterval = setInterval(function(){
        foo(myInterval);
    },50);
};

var foo = function (myInterval) {
    clearInterval(myInterval);
};
94
jbabey
clearInterval(myInterval);

fera l'affaire pour annuler l'intervalle chaque fois que vous en aurez besoin. Si vous souhaitez annuler immédiatement après le premier appel, vous devez prendre setTimeout à la place. Et bien sûr, vous pouvez l'appeler dans la fonction Intervalle elle-même.

var myInterval = setInterval(function() {
  if (/* condition here */){
        clearInterval(myInterval);
   } 
}, 50);

voir un EXEMPLE ici .

6
Christoph
var interval = setInterval(function() {
  if (condition) clearInterval(interval); // here interval is undefined, but when we call this function it will be defined in this context
}, 50);

Ou

var callback = function() { if (condition) clearInterval(interval); }; // here interval is undefined, but when we call this function it will be defined in this context
var interval = setInterval(callback, 50);
2
Danil Speransky

À partir de votre code, ce que vous semblez vouloir faire est d'exécuter une fonction et de l'exécuter encore et encore jusqu'à ce qu'une tâche soit effectuée ...

C'est en fait une tâche pour la setTimeout(), l'approche est similaire:

    var myFunction = function(){
      if( stopCondition ) doSomeStuff(); //(do some stuff and don't run it again)
        else setTimeout( myFunction, 50 );
    }
    myFunction(); //immediate first run 

Aussi simple que cela :)

Bien sûr, si vous voulez vraiment utiliser setInterval pour une raison quelconque, la réponse de @ jbabey semble être la meilleure :)

1
jave.web

Vous pouvez le faire en utilisant une astuce avec window.setTimeout

var Interval = function () {
    if (condition) {
        //do Stuff
    }
    else {
        window.setTimeout(Interval, 20);
    };
};
window.setTimeout(Interval, 20);
1
maniac