BlogKontaktTagcloud

Synchroner Aufruf mit XMLHttpRequest in Firefox

Ein synchroner XMLHttp-Aufruf in JavaScript ist theoretisch nicht so schwer. Die Dokumentation ist, wohl weil synchrone Aufrufe im Vergleich zu asynchronen relativ selten benötigt werden, eher spärlich und teilweise verwirrend. Das grösste Problem ist dass das XMLHttpRequest-Objekt sind nicht in allen Browsern gleich verhält. So lässt sich der untenstehende Request im Konqueror (und wohl auch in älteren Internet Explorern und Safari) ausführen, obwohl der Aufbau eigentlich falsch ist.

//Not valide Request!
xmlHttp.open('GET', 'json.php?name='+name, false);
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState == 4) {
var resp = eval(xmlHttp.responseText);
saveVar.c = resp['id'];
if(vonNr.c && zuNr.c){
foundIDs();
}
}
};
xmlHttp.send(null);
Diese direkte Umwandlung des asynchronen Request in eine Synchronene ist nicht zulässig und funktioniert deshalb im Firefox (und vermutlich in anderen Browser die den Mozilla-Kern verwenden) nicht. Der korrekte asynchrone Aufruf sieht wie folgt aus:

xmlHttp.open('GET', 'json.php?name='+name, false);
xmlHttp.send(null);

var resp = eval(xmlHttp.responseText);
saveVar.c = resp['id'];
if(vonNr.c && zuNr.c){
foundIDs();
}
Wobei in diesem Fall die Methode send blockierend ist und auf die Antwort vom Server wartet. Der nachfolgende Code wird erst nach dem send eine Antwort erhalten hat ausgeführt.
Ähnliche Beiträge:
Parallel Request mit AJAX und PHP
Faster google maps with JSON
Web-Continuations - Technolgie 2007
"Defekte" for-in-Schleife in JavaScript
Assoziative Array nach Value sortieren
Comments (2)  Permalink

comments

Harry Fuecks @ 24.10.2006 14:07 CEST
But the problem with synchronous requests is also this: http://www.phppatterns.com/stuff/sync.html - locks your browser if anything goes wrong. Did that demo as part of this talk: http://www.sitepoint.com/blogs/2006/02/10/ajaxlocalhost/
leo @ 25.10.2006 23:31 CEST
Intressting slides! Mein Problem war das ich zwei gleichartige Requests an den Server hatte und diese am Schluss nicht mehr synchronisieren konnte (multithreading with javascript realy sucks!). Theoretisch hätte ich diese asynchronen Request auch einfach nacheinander ausführen können, das der Browser beim synchronen Request blockiert habe ich nicht gewusst.

add a comment

The Trackback URL to this comment is:
http://leo.freeflux.net/blog/plugin=trackback(1706).xml

This blog is gravatar enabled.
Your email adress will never be published.
Comment spam will be deleted!

Name*
E-Mail
For Spammers Only
URL
Kommentar*
E-Mail Benachrichtigung bei neuen Kommentaren zu diesem Eintrag
Speichere meine Daten (braucht Cookies)