Ajax <-> PHP <-> XML Response <-> in einer Schleife....

NetBull

Erfahrenes Mitglied
hi,

arbeite mich immer noch in Ajax ein.
Gestern hab ich noch so Anfängersachen gehabt. Da bin ich drüber weg.

Aber mal ne Frage:
Ein JavaScript ruft über eine Schleife eine Funktion eines Objeiktes/Prototypes auf
>> this.SaveData = function (aOutputTag, aValue, aStatus)<<
welche lediglich Daten zu einem neuen Datensatz an PHP übergibt.

Innerhalb der Schleife (bei 10 Durchläufen!) bekomme ich im FireBug 10 Response (GET)!
bei syncron speichert es, die Responses sind 1A. Im ayncronen sind alle ROT und Aborted.
Ausserdem kann ich in beiden Modi keine Ausgaben an ein innerHTML in einem DIV machen.

Muss ich hier noch was beachten, wenn ich alle Requests gleichzeitig raushauen will und dann das Response bearbeiten sobald ein neues vorliegt?

LG NetBull...
 
in C# würde ich nun an Delegates und Invoke denken... Aber ich hab zu JavaScript nix gefunden das passt...
 
Ich nehme mal stark an, dass das abort dadurch kommt, dass du für alle zehn Anfragen das gleiche XMLHttpRequest Objekt verwendest. Entweder du musst die Requests in eine Queue stecken und nacheinander abarbeiten, oder du benutzt jedes mal ein neues Objekt dafür.

Des weiteren würde ich deiner Funktion einen vierten Parameter namens "aCallback" o.ä. geben, den du dann aufrufst, wenn die Anfrage erfolgreich zurück kommt.

Javascript:
this.SaveData = function (aOutputTag, aValue, aStatus, aCallback) {
    var req;
    //Hier machst du deine Anfrage fertig...
    req.onreadystatechange = function() {
        if(req.readyState === 2 && (req.status === 200 || req.status === 302)) {
            aCallback();
        }
    };
}

//Der Aufruf
foo.SaveData('bar', 'baz', 'bacon', function() {
    alert('fertig!');
});



//Oder auch
function onReady() {
    alert('fertig');
}

foo.SaveData('bar', 'baz', 'bacon', onReady);
 
Ok, das ist schon mal einleuchtend. Danke Dir.

Wenn ich nun aus der Funktion die ich onreadystatechange zugewiesen habe ein Objekt aus dem Parent brauche, wie komm ich da ran?

XmlRequest.onreadystatechange = function()
{
alert(this.Parent.InfoTag);
}
 
Ich weiß ja nicht wie deine Klasse aufgebaut ist, aber normalerweise hat man für solche Fälle eine private Variable namens "_this" oder "self" o.ä. um die durch das Scoping entstehende Überdeckung zu vermeiden.


Javascript:
var _this = this;

//...Rest der Klasse

this.SaveData = function (aOutputTag, aValue, aStatus, aCallback) {
    var XmlRequest;

    //Hier machst du deine Anfrage fertig...

    XmlRequest.onreadystatechange = function() {
        alert(_this.Parent.InfoTag);
    };
}

Oder unschön direkt in der Methode. Unschön deshalb, weil du das ja eventuell an mehreren Stellen brauchst.

Javascript:
this.SaveData = function (aOutputTag, aValue, aStatus, aCallback) {
    var _this = this;
    var XmlRequest;

    //Hier machst du deine Anfrage fertig...

    XmlRequest.onreadystatechange = function() {
        alert(_this.Parent.InfoTag);
    };
}
 
Merkwürdigerweise kann ich die Parameter der äusseren Funktion in der inneren einfach so verwenden. ****? Langsam bekomme ich Angst vor JavaScript!

this.SaveData = function (InfoTag) {
var XmlRequest;
XmlRequest.onreadystatechange = function() {
alert(InfoTag);
};
}

Langsam bekomme ich Angst vo js.....
 
OK, das mit den Vars habe ich hinbekommen, aber asyncron will es immer noch nicht laufen. Mag sich hier mal wer mein beispiel projekt ansehen. Ich komm da einfach nicht mehr weiter.
 
Ohne deinen Code kann ich auch nur raten. Wenn du nicht alles hier rein Stellen willst, dann schick mir eine PM.
 
sorry war ein paar Tage im Stress, hier mal der Code:
Code:
function initiateAjax()
	{
		var XmlRequest;
		
		try
		{
			XmlRequest = new XMLHttpRequest();
		}
		catch (e)
		{
			try
			{
				XmlRequest = new ActiveXObject("Msxml2.XMLHTTP");
			} 
			catch (e)
			{
				try
				{
					XmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
				} 
				catch (failed)
				{
					XmlRequest = null;
				}
			}  
		}
		
		return XmlRequest;
	}

	function doLoadRequest(ctr)
	{
		XmlRequest = initiateAjax();
		
		if(document.getElementById("info_tag").innerHTML != "")
			document.getElementById("info_tag").innerHTML += "<br>";
		document.getElementById("info_tag").innerHTML = '<strong>Loading: ' + ctr + '</strong>';		
		
		XmlRequest.onreadystatechange = function()
		{
			switch(XmlRequest.readyState)
			{
				case 4:
					if(XmlRequest.status!=200) 
					{
						if(document.getElementById("info_tag").innerHTML != "")
							document.getElementById("info_tag").innerHTML += "<br>";
						document.getElementById("info_tag").innerHTML = '<strong>' + XmlRequest.status + '</strong>';
					}
					else
					{	             
						if(document.getElementById("info_tag").innerHTML != "")
							document.getElementById("info_tag").innerHTML += "<br>";
						document.getElementById("info_tag").innerHTML = '<strong>' + XmlRequest.responseText + '</strong>';
					}
					break;

		        default:
		            return false;
		        break;
			}
		};
		
		var params = "?ctr="+ctr;
		XmlRequest.open("GET", "AjaxResponse.php"+params, true);
		XmlRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		XmlRequest.send(null);
	}
	
	
	function pageLoad()
	{
		for(i=0; i<10; i++)
			doLoadRequest(i);
	}

Problem, ermacht zwar alle Requests, gibt aber nur den letzten aus.

PHP Code aus AjaxResponse.php
Code:
<?php

	
	sleep(3);
	$i = $_REQUEST["ctr"];
	echo $i;

?>

und Danke , cu s00n, NetBu||
 
das Beispiel scheint die Requests sauber aus zu führen, aber es wird nur der letzte Request in das DIV Tag (info_tag) geschrieben.

Woran kann das lieben?
Mittlerweilse habe ich document.getelementbyid mit += erweitert. Vorher wurde es immer überschrieben.
 
Zurück