Hallo Rolf,
danke für deine ausführliche Antwort. Uuuund schon was gelernt... von fetch() hab ich noch nie was gehört. Das sieht ja wesentlich freundlicher aus als XMLHttpRequest. Ich bleibe jetzt aber mal bei zweiterem und stürze mich auf dein erstes Beispiel…
Achso…
Ich unterstelle mal, dass dein sleep.php ein Dummy ist. Denn um 5s zu warten, braucht man keinen Servercode. Das geht mit setTimeout().,
Ja, damit konnte ich für mich eine Ladeverzögerung im AJAX-Script am einfachsten simulieren.
Beste Lösung: verwende fetch statt XMLHttpRequest und nutze die Promises, die dabei herauskommen.
Zweitbeste Lösung: Bleibe bei XMLHttpRequest und initialisiere ein Promise, das Du im readyState 4 auf resolved setzt
function warte(millisecs) { return new Promise((resolve, reject) => { setTimeout(resolve, millisecs); }); } warte(5000) .then(button_einblenden);
Ich bin nicht sicher, ob ichs komplett verstanden habe, aber ich glaube, selbigen Effekt habe ich hiermit grundsätzlich auch erstmal, oder?
function ajaxdaten() {
function ajax1(sleep.php) {
// sleep.php sendet nach 5 Sekunden einen Rückgabewert
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
button_einblenden();
}
});
}
}
Ich versuche mein Problem mal nochmal etwas zu verdeutlichen. Ich eröffne in meiner Funktion ajaxdaten() einfach mal zwei AJAX-Verbindungen. Das ist nicht das, was bei mir passiert und auch nicht unbedingt logisch, aber vielleicht wird so mein Problem am klarsten:
function ajaxdaten() {
ajax1(sleep.php) {
...
// sleep.php sendet nach 5 Sekunden einen Rückgabewert
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
button_einblenden();
}
});
ajax2(nosleep.php) {
...
// sleep.php sendet ohne Verzögerung einen Rückgabewert
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
button_einblenden();
}
});
}
button_einblenden();
}
Im Grunde sieht man schon, dass es murx ist. Denn ajax2 und auch die Hauptfunktion dürfen ja den Button noch gar nicht einblenden, weil ajax1 noch nicht fertig ist. Um das abzufragen, müsste ich vielleicht mit einem Zähler die geöffneten Verbindungen hochzählen (toll, und schon hab ich wieder eine globale Variable außerhalb der Funktion) bzw. mit dem Aufruf der button_einblenden() herunterzählen und schauen, ob noch Verbindungen offen sind...
Ließe sich das mit Promises klüger bewerkstelligen?
Gruß Nico