Frage

Ich versuche, einen SetTimeout in einem SetInterval -Rückruf anzurufen:

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 funktioniert wie erwartet, aber SetTimeout -Anruf fällt aus. Ich denke, das Problem hängt mit der Tatsache zusammen, dass ich auf eine Variable (myvar) bezog, die nicht im Bereich ist.

Was ist der beste Weg, dies zu lösen?

War es hilfreich?

Lösung

Dies ist ein perfekter Kandidat für Schließungen:

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);

Ihr Problem hängt umfangreiche zusammen, und das würde sich darum kümmern.

Andere Tipps

Ich hatte ein ähnliches Problem. Das Problem war, dass ich versuchte, eine Methode über einen SetTimeout () an sich aufzurufen. So etwas, was für mich nicht funktioniert hat:

function myObject() {

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

}

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

Das Folgende funktionierte auch nicht:

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

Die Lösung bestand darin, mit () Anweisung wie SO zu verwenden:

function myObject() {

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

}

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

Natürlich ist dies ein endloser Zyklus, aber der Punkt, den ich hier mache, ist anders.

Hoffe das hilft :)

Versuchen Sie, Strings nicht als Parameter zu verwenden zu verwenden setTimeout und setInterval Weil das aufrufen wird eval ... Die Verwendung des folgenden Formulars kann auch dieses Problem erleichtern, um zu verstehen/zu debuggen:

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

Führen Sie es in Firefox und prüfen Sie Tools | Fehlerkonsole. Wenn SetTimeout fehlschlägt, kann es Ihnen sagen, warum dort.

Versuchen Sie auch zu ersetzen "someFunction();" mit "alert('hi')" (Kein Semikolon) und prüfen Sie, ob das funktioniert. Wenn ja, wird das Problem erheblich eingeschränkt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top