• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

clearTimeout auf einen Array

Status
Für weitere Antworten geschlossen.

Durek

Neues Mitglied
Hallo ;)
ich habe ein Problem. Ich habe einen Array voller Timeouts (ist ein umgeschriebenes Beispiel, nicht das Original):
Code:
timeouts = new Array();
for(i=0;i<50;i++)
timeouts[i] = window.setTimeout("test();",300*i);

//nun will ich diese beenden. Beide sind in einer Funktion und nicht im Hauptteil.
for(i=0;i<50;i++)
window.clearTimeout(timeouts[i]);

Meine Idee klappt allerdings nicht so ganz. Wenn nötig: es ist mir möglich zu sagen, welche Timeouts noch aktiv sind, da hier als bsp. test(); die letzte Zählvariable immer überschreibt und somit global parat hat.

Ich hoffe ihr könnt helfen und danke schonmal im Vorraus ;)

Gruß,
Dominik
 
Werbung:
Ja, globale Variabeln sind schlecht und globale Schelifenvariabeln sind richtiger Mist, das kannst du einfach mit var ändern.

Die Timeouts abbrechen kannst du mit einer einfachen Schleife:
Code:
for(var i=0;i<timeouts.length;i++)
if(timeouts[i])window.clearTimeout(timeouts
[i]);
Wobei ich aber an deiner Stelle das ganze mit closures machen würde, anstatt 50 Timeouts zu erzeugen, das kann nicht performant sein.

z.b. mit der Timer Funktion
Code:
test.Timer(100, 50);
 
Naja eigentlich werden von einem String nachundnach immer ein Buchstabe genommen und an einen DIV gehangen (deswegen die Information des Indexes mit .length. Die Variable ist bei mir auch nicht global, sorry die unmissverständliche Ausdrucksweise). Das kennt man ja von den Gameboyspielen. Mir gehts jetzt darum, dass wenn ich Enter drücke, dieser Text vervollständigt wird ohne zu warten^^ macht er auch... Problem ist dabei, dass die ausstehenden Buchstaben trotzdem noch nachher angehangen werden, da die Timeouts weiterlaufen.

Ich habe eine genau solche Schleife wie du sie mir genannt hast. verwendet, diese kappt ja nicht. Außerdem sagt er mir bei "javascript:alert(timeouts.length);" undefined. Dies kann natürlich ein/der Grund sein, weswegen es nicht klappt.

edit: ich habe nun alles umgeschrieben und rekursiv gelöst, sodass nur ein Timeout unterbrochen werden muss. Danke trotzdem für die Antwort.
 
Zuletzt bearbeitet:
Werbung:
Naja eigentlich werden von einem String nachundnach immer ein Buchstabe genommen und an einen DIV gehangen (deswegen die Information des Indexes mit .length. Die Variable ist bei mir auch nicht global, sorry die unmissverständliche Ausdrucksweise).
Doch die Variabel i ist global! Und das ist sehr schlecht.


Ich habe eine genau solche Schleife wie du sie mir genannt hast. verwendet, diese kappt ja nicht. Außerdem sagt er mir bei "javascript:alert(timeouts.length);" undefined. Dies kann natürlich ein/der Grund sein, weswegen es nicht klappt.
Das kann nicht sein, dann machst du etwas falsch.

edit: ich habe nun alles umgeschrieben und rekursiv gelöst, sodass nur ein Timeout unterbrochen werden muss. Danke trotzdem für die Antwort.
Rekursiv sicher nicht.
 
Doch die Variabel i ist global! Und das ist sehr schlecht.
In dem Beispiel ist i global. Ja! In meinem richtigen Script ist i auch so deklariert, dass es nur innerhalb der Funktion gilt. Daher sorry, es war auch nur in meinem Sinn zu sagen, dass clearTimeout bei mir nicht geklappt hat und hab dann eben ein Beispiel geschrieben (kein Auszug des Originals).

Das kann nicht sein, dann machst du etwas falsch.
Ist mir bewusst, nur was weiß ich nicht ;)

Rekursiv sicher nicht.
Also wenn ich den Begriff richtig verstanden habe, so ruft sich die Funktion selbst innerhalb dieser auf. Das tut sie, lediglich Zeitversetzt mit setTimeout();

Funktioniert aber nun Prima: http://finalworld.ath.cx wenn du in die weiße Fläche läufst, kannst du nun den Text vorzeitig anzeigen lassen.
 
Also wenn ich den Begriff richtig verstanden habe, so ruft sich die Funktion selbst innerhalb dieser auf. Das tut sie, lediglich Zeitversetzt mit setTimeout();
Dann ist es keine Rekursion im, eine Rekursion liegt vor, wenn eine Funktion sich innerhalb der Funktion selber aufruft. Ein Timeout ist aber ein Wechsel des Kontext.

Deutlich wird es, wenn du den Code ausführst:
Code:
function test() { test(); }
function test() { window.setTimeout(test, 1); }
Im ersten Fall sagt dir Firefox, dass du zu viele Rekursionen ausführst, im zweiten Fall passiert nichts.

Zum Code an sich kann ich nichts sagen, da dein Code ziemlich unlesbar ist.
 
Werbung:
Status
Für weitere Antworten geschlossen.
Zurück
Oben