Klaus: Mehrere Ajax-Aufrufe nacheinander?

Hallo,

ich würde gerne mehrere Ajax-Aufrufe nacheinander aufrufen,
aber dabei soll der 2. Aufruf aber in Abhängigkeit vom Ergebnis des 1. aufgerufen werden.

Ein Ajax Aufruf sieht bei mir etwa so aus:

  
	function save1(idnr,stat) {  
		var req = createXMLHttpRequest();  
		req.onreadystatechange = function() {  
			switch(req.readyState) {  
				case 0:  
				case 1:  
				case 2:  
				case 3: return;  
				case 4: break;  
			}  
			sapresulttext = req.responseText;  
			if (sapresulttext.IndexOf("-OK-") >= 0) {  
				document.getElementById("div_planer").innerHTML = erg_ok;  
				result = 1;  
			} else {  
				result = 0;  
				document.getElementById("div_planer").innerHTML = erg_fehler+" "+sapresulttext;  
			}  
			return result;  
		}  
		xurl = rootpfad+"/templates/do_save.php?idnr="+idnr+"&stat="+stat;  
		req.open('get', xurl);  
		req.send(null);  
	}  

Wie mache ich das am Besten, wenn ich jetzt mehrere Aufrufe in Abhängigkeit hintereinander schalten möchte?

Folgendes geht jedenfalls nicht, er läuft direkt durch, 2 und 3 werden nicht mehr aufgerufen, da dann result noch nicht 1 sein ist.

  
		document.getElementById("div_urlaub_sap").innerHTML = loading;  
		result = save1(idnr,stat);  
  
		if (result == 1) {  
			document.getElementById("div_urlaub_notes").innerHTML = loading;  
			result = save2(idnr,stat);  
		}  
  
		if (result == 1) {  
			document.getElementById("div_urlaub_planer").innerHTML = loading;  
			result = save3(idnr,stat);  
		}  

  1. 2 und 3 werden nicht mehr aufgerufen,

    Die existieren ja auch nicht in deinem Script.

  2. Hallo,
    Bei Asynchronen Requests blockiert die Ausführung des Programms nicht, sondern läuft einfach weiter, während der Request abgearbeitet wird. In Deinem Beispiel wird der Request abgeschickt:

      
    req.open('get', xurl);  
    req.send(null);  
    
    

    und dann die Funktion (save1) sofort verlassen (mit return result). - es wird nicht gewartet, bis der Request erfolgreich (oder auch nicht) beantwortet wurde. Daher steht das Ergebnis des Aufrufs bei Verlassen der Funktion noch gar nicht fest, deswegen liefert save1() grundsätzlich nicht das Erwartete zurück.

    Dein Event-Handler

      
    req.onreadystatechange = function () {...}  
    
    

    hingegen ist genau dafür da, Dinge erst dann zu tun, wenn ein Ergebnis vorliegt - der Inhalt der Funktion wird erst ausgeführt, wenn der Request beantwortet wurde.

    Wenn Du also etwas ausführen möchtest, was von dem Ergebnis des Requests abhängig ist (z.b. Dein zweiter Request save2()), so musst Du das in diesen Handler schreiben.
    Wenn Du einen dritten Request starten möchtest, aber erst, wenn der zweite fertig ist, so muss dieser Aufruf in den onreadystatechange-Handler in "save2()"...und so fort.

    Wenn Du mehrere solcher Request-Funktionen (save1....saveX) hast, und diese sehr ähnlich sind, würde ich mir überlegen, ob man das nicht etwas generischer lösen kann (z.b. mit einem Array aus Request-Objekten, dem nach jedem erfolgreichen Request ein weiteres Request-Objekt entnommen und verarbeitet wird, so lange, bis das Array leer ist). Aber das sind dann eher kosmetische Korrekturen ;)

    Hope that helps,
    Jörg