Zeitproblematik beim Ablauf von JavaScripts
PNV
- javascript
0 n.d. parker0 Frank
Liebe Forumler!
Mal wieder quält mich eine Frage, ich hoffe ich kann sie einigermaßen verständlich herüberbringen :-)
Es geht darum, in welcher Reihenfolge ein Browser Javascript-Befehle interpretiert.
Die Antwort erscheint simpel: einen nach dem anderen ;-)
function Beispiel1()
{
Befehl1;
Befehl2;
Befehl3;
}
Komplizierter wird es aber, wenn die Befehle nicht hintereinander stehen, sondern sich der Browser durch verschiedene Unterfunktionen arbeiten muß.
Auch hier ist die Antwort nicht schwer: die Befehle werden in der Reihenfolge ihres Auftretens abgearbeitet.
function Beispiel2()
{
Befehl1;
Unterfunktion1();
Unterfunktion2();
}
function Unterfunktion1()
{
Befehl2;
}
function Unterfunktion2()
{
Befehl3;
}
Problematisch wird es, wenn die Funktionen nicht sequentiell, sondern zeitgesteuert ausgeführt werden, etwa durch Verwendung von setInterval oder setTimeout.
function Beispiel3()
{
Befehl3;
window.setTimeout("Unterfunktion1()",1000);
window.setTimeout("Unterfunktion2()",1000);
}
function Unterfunktion1()
{
Befehl2;
}
function Unterfunktion2()
{
Befehl3;
}
Welche Funktion wird denn jetzt zuerst ausgeführt? Wahrscheinlich die Unterfunktion1 vor Unterfunktion2, aber wohl mit wenigen ms dazwischen, da bei einem setTimeout-Befehl die folgenden Befehle interpretiert werden, bevor die Verzögerungszeit abgelaufen ist, jedoch der 'Countdown' unmittelbar beginnt, bevor der nächste Befehl eingelesen wird.
Das war der harmlose Teil, der Klops kommt erst jetzt:
Nehmen wir an, wir haben eine zentrale Funktion, die von allen anderen Funktionen, die zu beliebigen Zeiten und beliebig oft starten, aufgerufen wird. Diese zentrale Funktion setzt den Wert einer globalen Variablen abhängig von den Parametern beim Aufruf und kommuniziert so mit den aufrufenden Funktionen, denn diese Verarbeiten den Wert der globalen Variablen in der Annahme, daß sie noch den Wert hat, den sie nach dem Aufruf der zentralen Funktion haben sollte. Jetzt könnte es aber doch sein, daß bei der Verarbeitung in einer dieser Funktionen der Wert der globalen Variablen bereits durch den Aufruf der zentralen Funktion durch eine andere Funktion ein anderer als erwartet ist.
// zentrale Funktion
var Elefant="grundierter Elefant";
function ElefantAnmalen(Farbe)
{
Elefant=Farbe+"er Elefant"
}
//aufrufende Funktionen
function Maler1()
{
ElefantAnmalen("rot");
// hier stehen ein paar Befehle, die den Browser ein bisschen auf Trab halten sollen, um eine gewisse Zeitverzögerung zu erreichen, die größer ist als die paar ms aus dem Beispiel 3
window.status=Elefant;
}
function Maler2()
{
ElefantAnmalen("blau");
window.status=Elefant;
}
Man denke sich jetzt noch hunderte Maler-Funktionen, alle mit verschieden umfangreichen 'Beschäftigungs-Bereichen' hinzu. (Ich weiß, das ist irrsinnig bei dem Beispiel, aber denken wir uns das mal).
function Beispiel4()
{
window.setTimeout("Maler1()",1000);
window.setTimeout("Maler2()",1000);
//es folgen weitere Aufrufe der verschiedenen Maler-Funktionen, alle ganz knapp hintereinander
}
Gibt es jetzt ein furchtbares Tohuwabohu, bei dem die Elefanten bunt durcheinandergewürfelt werden, weil sich die Maler-Funktionen 'überlappen'? Wenn ja, läßt sich dieses Problem nur durch die Verwendung von return lösen (statt der globalen Variablen)? Dies würde nämlich meine Funktionen aufblähen, weil eval()-Konstrukte nötig würden :-(
Schöne Grüße & vielen Dank
Dominic
hi ho
ich hatte mal ein aehnliches Problem, da ging es allerdings um Mouseovers, die sich mit mouseouts ueberlappt haben etc.., ich hab das mit ner (globalen) locking-Variable geloest, also:
function Maler1()
{
if (lock) setTimeout("Maler1()",1); // oder so
lock=true;
ElefantAnmalen("rot");
window.status=Elefant;
lock=false;
}
ich bin zwar nicht ganz sicher, ob es das problem vollstaendig loest, zumindest verkleinert es das Fehlerpotential um einiges :-), vielleicht faellt ja jemandem noch was schoeneres ein...
HTH
cua
n.d.p.
Hallo Du!
Ich könnte mir vorstellen, daß Du einfach die Timerzeiten unterschiedlich setzt! Also 1000 und 3000 und 5000 usw.
Vielleicht funktioniert es ja damit!
bis danni
cu Frank