So lösen Sie VAR aus dem SetTimeout -Anruf VAR aus dem Umfang
-
04-07-2019 - |
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?
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.