Question

J'essaie d'appeler un setTimeout à partir d'un rappel setInterval:

function callback()
{
   //assign myVar
   var myVar = document.getElementById("givenID");
   //...
   //now wait 2 secs then call some code that uses myVAr
   setTimeout("myVar.innerHTML = 'TEST'", 2000);
}

setInterval("callback();", 10000);

setInterval fonctionne comme prévu, mais l'appel de setTimeout échoue. Je suppose que le problème est lié au fait que je référence une variable (myVar) qui n’est pas dans la portée.

Quelle est la meilleure façon de résoudre ce problème?

Était-ce utile?

La solution

C'est un candidat idéal pour les fermetures:

setInterval(
    function ()
    {
       var myVar = document.getElementById("givenID");
       setTimeout(
          function()
          {
              // myVar is available because the inner closure 
              // gets the outer closures scope
              myVar.innerHTML = "Junk";
          },2000);
    }, 10000);

Votre problème est lié à la portée, ce qui éviterait cela.

Autres conseils

J'ai eu un problème similaire. Le problème était que j'essayais d'appeler une méthode à partir de lui-même via setTimeout (). Quelque chose comme ça, qui n'a pas fonctionné pour moi:

function myObject() {

   this.egoist = function() {
      setTimeout( 'this.egoist()', 200 );
   }

}

myObject001 = new myObject();
myObject001.egoist();

Ce qui suit N'AUSSI PAS FONCTIONNÉ:

... setTimeout( egoist, 200 );
... setTimeout( egoist(), 200 );
... setTimeout( this.egoist, 200 );
... setTimeout( this.egoist(), 200 );
... setTimeout( function() { this.egoist() }, 200 );

La solution consistait à utiliser l'instruction with () comme suit:

function myObject() {

   this.egoist = function() {
      with (this) { setTimeout( function() { egoist() }, 200 );}
   }

}

myObject001 = new myObject();
myObject001.egoist();

Bien sûr, le cycle est sans fin, mais ce que je veux dire ici est différent.

J'espère que cela vous aidera:)

Par souci de bonne pratique, essayez de ne pas utiliser de chaînes comme paramètres de setTimeout et de setInterval car cela invoquera eval . Utiliser le formulaire suivant peut également rendre ce problème plus facile à comprendre / déboguer:

setInterval(function () {
    // do stuff
    // ...
    // now wait 2 secs then call someFunction
    setTimeout(someFunction, 2000);
}, 10000);

Lancez-le dans Firefox et cochez Outils | Console d'erreur. si setTimeout échoue, cela peut vous expliquer pourquoi.

Essayez également de remplacer "someFunction ();" "par " alert ('hi') " (sans point-virgule) et voyez si cela fonctionne. Si tel est le cas, le problème est considérablement réduit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top