[erledigt] Ajax - nur letzter Request funktioniert

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
Benutzeravatar
moon22
Mitglied
Beiträge: 50
Registriert: 01.08.2005 21:11

[erledigt] Ajax - nur letzter Request funktioniert

Beitrag 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
Zuletzt geändert von moon22 am 05.10.2008 19:02, insgesamt 1-mal geändert.
Benutzeravatar
moon22
Mitglied
Beiträge: 50
Registriert: 01.08.2005 21:11

Beitrag 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
Grüße
Markus
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag 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.
KB:knigge
Benutzeravatar
moon22
Mitglied
Beiträge: 50
Registriert: 01.08.2005 21:11

Beitrag 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.
Grüße
Markus
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“