Seite 1 von 1

[erledigt] Ajax - nur letzter Request funktioniert

Verfasst: 02.10.2008 14:29
von moon22
Hallo Forengemeinde!

Ich habe ein kleines Ajax Problem. Mit einem Java Script werden auf einer Forenseite in einer Schleife alle Userid's eines Browsergames ausgelesen und per Ajax weiterverarbeitet. Ist das nur eine Userid, funktioniert das auch recht gut. Sind es aber mehrere, so werden die http Requests zwar von der Schleife abgesetzt (im Firebug gut zusehen) aber nur das letzte funktioniert bzw. erhalte ich nur vom letzten eine Antwort im Form der xml Datei zurück.
Wieso??

Hier das Java Script:

Code: Alles auswählen

var http_request = false;

function createRequestObject() {
	var reqobj;
	var browser = navigator.appName;
	if(browser == "Microsoft Internet Explorer") {
		reqobj = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		reqobj = new XMLHttpRequest();
	}
	return reqobj;
}

var http_request = createRequestObject();

function sendRequest(UserID) {
	http_request.open('get', './includes/scripts/ajax.php?userid='+UserID);
	http_request.onreadystatechange = handleResponse;
	http_request.send(null);
}

function handleResponse() {
	if(http_request.readyState == 4 && http_request.status == 200) {
		var xmlDoc	= http_request.responseXML;
		var UserID  = xmlDoc.getElementsByTagName('id')[0].firstChild.nodeValue;
		if(document.getElementById('pname_'+UserID))
			document.getElementById('pname_'+UserID).innerHTML = xmlDoc.getElementsByTagName('name')[0].firstChild.nodeValue;
	}
}

function get_data(UserID) {
	sendRequest(UserID);
}
Das PHP Script war genau so schwierig zu programmieren, wie es aussieht:

Code: Alles auswählen

<?php
$userid = $_GET['userid'];

header('Content-Type: text/xml; charset=utf-8');
echo file_get_contents('http://www.url.com/user.' . $userid . '.xml');
?>
Ist einfach nur eine Live-Ansicht einer entfernten xml Datei. :D
Da ich ja keine entfernten xml Datein mit java Script auslesen kann. (oder?)

Die schleife am Ende der Seite ruft dann einfach nur jedes Mal wenn eine UserID erkannt wurde die funktion get_data(UserID) auf.

Ich hoffe es kann jemand helfen.

Danke und Grüße
Markus

Verfasst: 04.10.2008 17:33
von moon22
Habe nun rausgefunden woran das liegt.

Da die Abfrage ja asynchron läuft (AJAX) ist die Schleife schneller als dass readyState den Wert 4 (vollständig) erhält.
Kann man den Status irgendwie (sanft) vorher prüfen und die Ausführung in den Urlaub schicken? Eine while Schleife ist ja hier weniger angebracht.

Gibt es da andere Lösungsansätze? Javascript ist ja nicht so meine lieblingssprache. :D

Danke und Grüße
Markus

Verfasst: 04.10.2008 17:43
von Pyramide
Erstelle doch einfach für jede Anfrage ein neues XMLHttpRequest Objekt. Oder noch besser: Starte nur eine Abfrage für alle Benutzer. Wie der Code dann genau aussehen muss, kann ich dir aber ohne Kenntnis der XML-Struktur nicht sagen.

Verfasst: 04.10.2008 18:18
von moon22
Also das mit dem neuen erstellen eines Request Objekt für jede Abfrage ist genjal! An das habe ich noch gar nicht gedacht! Wie engstirnig man doch manchmal denkt.
Hab's getestet und funktioniert wunderbar (musste dafür gar nur eine Zeile im Code ändern) :D

Mit einer Abfrage für alle User ging das natürlich auch. Da habe ich auch schon dran gedacht. Nur wenn das irgendwann mal mehrere User-ID's werden - oder dar viele, dann müssen die alle in einer Wurst übergeben werden -> nicht so schön.

Aber danke Du hast mir sehr geholfen! :grin:

Edit: Habe mich letztendlich doch für die Übermittlung aller UserID’s in einem Request entschieden. Ist einfach schneller und weniger fehleranfällig.
Thema erledigt.