Synchrones Javascript
Nils3
- javascript
Hallo,
wie es scheint gibt es in Javascript nicht die Möglichkeit eine Funktion als "synchronized" zu deklarieren. Ich bräuchte jedoch etwas ähnliches, hier ist mein Problem.
Ich habe eine Anzahl parallel laufender AJAX Requests, von denen jeder, wenn er fertig ist (stark vereinfacht) eine (vom Request bestimmte) Zahl in eine Tabellenzeile einfügt so dass die Werte in der Tabellenzeile aufsteigend geordnet sind. Der Code zum Einfügen in eine Zeile ist folgender:
function neueZelle (zahl) {
position = bestimmeZellenPosition("Zeile", zahl);
var td = document.getElementById("Zeile").insertCell(position);
td.doSomething(...);
}
Das funktioniert korrekt solange die AJAX Requests sequentiell laufen. Sobald diese parallel laufen, kann es vorkommen, dass beide gleichzeitig dieselbe Position in der Tabelle bestimmen und die Ordnung nicht eingehalten wird.
Beispiel: Request A und Request B haben die Werte 3 und 4 und in der Zeile stehen die Werte 1 und 6. Wenn nun beide gleichzeitig die Funktionen bestimmeZellenPosition() ausführen, werden beide denselben Wert erhalten (und zwar 1, die 2te Zelle). Wenn nun Request A den .insertCell() Aufruf vor Request B ausführt stehen am Ende die Werte 1, 4, 3, 6 in der Tabelle, was falsch ist
Hat jemand eine Idee wie man diesen Fall elegant vermeiden könnte (ohne auf sequentielle AJAX Requests umzusteigen)?
Vielen Dank vorab,
Nils
Hallo
Hat jemand eine Idee wie man diesen Fall elegant vermeiden könnte (ohne auf sequentielle AJAX Requests umzusteigen)?
Die Requests nacheinander abzugeben wäre meine erste Idee gewesen, aber das willst du offensichtlich nicht, warum auch immer. Wie wäre es damit, die Rückgabewerte der Ajaxfunktionen einzusammeln und erst dann, wenn alle Requests beantwortet sind, die Ausgabe am Stück zu erledigen?
Tschö, Auge
In JavaScript läuft eigentlich nichts wirklich parallel, auch die Handler von asynchronen XMLHttpRequest werden faktisch sequentiell abgearbeitet - es sei denn, du benutzt irgendwo selbst Timeouts, dann wird dieser Timeout hinten an die Queue der nacheinander auszuführenden Funktionen gehängt.
Auch Änderungen am DOM sollten dem danach ausgeführten Code direkt zur Verfügung stehen, deshalb frage ich mich, wie deine Funktion bestimmeZellenPosition die falsche Position liefern kann. Überwache am besten mal mit Firebug den Ablauf und lass dir mit console.log() und Konsorten ausgeben, was bestimmeZellenPosition von dem DOM zu Gesicht bekommt. Und zeige uns den Code doch mal. Geht es um einen bestimmten Browser oder ist das von dir beschrieben Verhalten in allen Browsern gleich?
Mathias