Konzeptfrage: Ajax-Rückmeldung
Kalle_B
- programmiertechnik
Hallöle,
in einer PHP- erzeugten Teilnehmerliste (550 Teilnehmer) gibt es pro Teilnehmer fünf Felder, die per Klick ein Ajax- Programm aufrufen.
Je nach Parameter- Übergabe storniert das per Ajax aufgerufene PHP- Programm
Bisher habe ich den Befehl zum Storno "blind" losgeschickt und im Vertrauen auf richtige Verarbeitung die Anzeige in der entspr. Zeile verändert, also z.B. aus 6 Vorträgen 0 gemacht.
Beim Testen mit einem einzigen User ist das ausreichend. Aber was ist, wenn das per Ajax gerufene Storno- Programm gegenüber der Liste veränderte Daten vorfindet, weil ein anderer User inzwischen schneller war?
Wie programmiert ihr Ajax- Anwendungen in Mehrbenutzer- Umgebung?
Lieben Gruß, Kalle
Hallo,
Wie programmiert ihr Ajax- Anwendungen in Mehrbenutzer- Umgebung?
Eigentlich musst Du dann nur dem Client mitteilen, ob die Anforderung geklappt hat oder nicht.
Ich würde es so machen:
Bei einem AJAX-Request schickt der Server im Erfolg einen JavaScript-Funktionsaufruf zurück, der im Frontend genau die Änderung durchführt, die der Server gemacht hat.
Also z.b.
function loesche_Anwesenheit_Tag(verantaltungstag, weranstaltungs_id) {
...
}
und der Server schickt
loesche_Anwesenheit_Tag(1,4711);
Für den Fehlerfall definierst Du einfach eine Fehlerfunktion z.b.:
function storno_error (message) {
alert ("Es ist folgender Fehler aufgetreten: "+message+", die Seite
wird neu geladen");
loaction.reload();
}
Passiert ein Fehler, weil die Daten nicht mehr konsistent sind (und ein User z.b. versucht eine Veranstaltung zu löschen, die es gar nicht mehr gibt), schickt der server:
storno_error ("Diese Veranstaltung existiert nicht: ");
Ist deine Server-Antwort XML-Basiert, musst du das nur in eine CDATA-Sektion schachteln, die du dann wieder auslesen kannst.
Jetzt musst Du beim Empfangen der AJAX-Antwort in Deiner onreadystatechange-Funtkion lediglich per Eval die Server-Antwort (also AJAXOBJEKT.responseText, bzw. bei XML-DOM responseXML, wenn Deine Antwort XML-basiert ist) ausführen.
Um Cross-Site-Scripting-Attacken zu verhindern kannst Du evtl. noch prüfen, ob die Server-Antwort einen sinnvollen Funktionsaufruf darstellt oder nicht.
-> Der User bekommt die Änderung im Frontend erst dann angezeigt, wenn sie auch wirklich durchgeführt wurde...ansonsten eine Fehlermeldung.
Wenn Du dem Benutzer dann noch anzeigst, dass gerade ein Ajax-request läuft(der typische Ladekreisel o.ä.), hast Du denke ich eine recht robuste, benutzerfreundliche Anwendung.
Wenn Du aber möchtest, dass das Ereignis "1 Benutzer hat was geändert, bitte auf allen Clients die Liste aktualisieren" an alle Benutzer verteilt wird: Sowas ist IMO mit HTTP nicht sinnvoll möglich.
Du könntest so etwas höchstens simulieren, z.b. in dem Du (wieder per Ajax) den Server peridisch fragst, ob die angezeigten Daten noch aktuell sind (z.b. durch Vergleich von zeitstempeln) - ist aber (finde ich) die weniger elegante Lösung und verursacht zudem unnötige serverlast.
Hope that helps,
Viele Grüße,
Jörg
Hallo, Jörg,
danke für deine ausführliche Antwort. Ich werde das nach deinen Angaben testen.
Lieben Gruß, Kalle