PHP Rocks
XMLHttpRequest zeitgesteuert mit setTimeout - Druckversion

+- PHP Rocks (https://www.php-rocks.de)
+-- Forum: HTML, CSS, Usability und Barrierefreiheit (https://www.php-rocks.de/https://www.php-rocks.de/forum/11-html-css-usability-und-barrierefreiheit.html)
+--- Forum: JavaScript / JavaScript Frameworks / Ajax (https://www.php-rocks.de/https://www.php-rocks.de/forum/13-javascript-javascript-frameworks-ajax.html)
+--- Thema: XMLHttpRequest zeitgesteuert mit setTimeout (/https://www.php-rocks.de/thema/119-xmlhttprequest-zeitgesteuert-mit-settimeout.html)



XMLHttpRequest zeitgesteuert mit setTimeout - Arne Drews - 23.11.2016

Hi,

Ich habe folgenden JS-Code:
Code:
var oXmlHttp = new XMLHttpRequest();
oXmlHttp.addEventListener( 'load', function() { alert( this.responseText ); });


window.onload = function() { reload(); }


function reload() {

    oXmlHttp.abort();

    oXmlHttp.open( 'GET', 'process.php?reload=1', true );
    oXmlHttp.send();

    setTimeout( 'reload', 3000 );

}
Der Aufruf und der Request werden einmal sauber verarbeitet, allerdings greift das setTimeout nicht wirklich, es werden keinen weiteren Daten mehr geladen.
Muss ich das XmlHtp-Objekt irgendwie jedesmal resetten? abort() habe ich ja schon drin, wirkt aber nicht.

Wo denke ich falsch?
Danke


RE: XMLHttpRequest zeitgesteuert mit setTimeout - tkausl - 23.11.2016

Kein jQuery? Sad

Ich habe mit rohen XMLHttpRequests seit Jahren nicht mehr gearbeitet und weiß auch nicht ob sie "wiederverwendbar" sind. Nutze am besten für jeden Request ein eigenes XMLHttpRequest.

Achja, und setz den Timeout im finish-handler, sonst wirst du komische Ergebnisse bekommen, wenn es grade Verbindungsprobleme gibt und der Request mehr als 3 Sekunden dauert.

Code:
window.onload = reload;

function reload() {
    var oXmlHttp = new XMLHttpRequest();
    oXmlHttp.onreadystatechange = function() {
        if(oXmlHttp.readyState !== 4) return; //4 == DONE
        setTimeout(reload, 3000 );
        alert( oXmlHttp.responseText );
    };
    oXmlHttp.open( 'GET', 'process.php?reload=1', true );
    oXmlHttp.send();
}



RE: XMLHttpRequest zeitgesteuert mit setTimeout - Arne Drews - 23.11.2016

Hi,

Das ist nur ein kleines Projekt, was nicht viel JS braucht und nur für den Request möchte ich keine Libraries oder Frameworks einbinden müssen.

Danke für Dein Beispiel. So ähnlich hatte ich es auch mal, bis auf den setTimeout im Handler drin.
Leider ändert das nichts am Verhalten, nach dem Laden der Seite läuft einmal alles sauber durch, aber danach nie wieder.

So sieht die Funktion derzeit aus:
Code:
function reload() {

     var oXmlHttp = new XMLHttpRequest();
     oXmlHttp.onreadystatechange = function () {

         if ( oXmlHttp.readyState !== XMLHttpRequest.DONE )
             return;

         setTimeout( reload, 3000 );
         alert( oXmlHttp.responseText );

     };

     oXmlHttp.open( 'GET', 'process.php?reload=1', true );
     oXmlHttp.send();

}



RE: XMLHttpRequest zeitgesteuert mit setTimeout - tkausl - 23.11.2016

Hab es so wie du es da hast, 1 zu 1 (nur URL geändert) in JSFiddle reinkopiert:

https://jsfiddle.net/kcv9bxLt/

Bei mir ploppt das alert alle 3 Sekunden auf.


RE: XMLHttpRequest zeitgesteuert mit setTimeout - Arne Drews - 23.11.2016

Verdammt... Du hast recht!
Dann kann es ja nur Server seitig hängen. Evtl. die .htaccess? Wobei ich mich frage, warum es beim ersten mal funktioniert.
Egal, dann muss ich wohl an anderer Stelle suchen.

Danke Dir!
Gruß Arne


RE: XMLHttpRequest zeitgesteuert mit setTimeout - Arne Drews - 23.11.2016

Ich habe eben erst bemerkt, dass die Änderungen des Scripts gar nicht hochgeladen wurden, weil mein FTP-Client das Passwort bestätigt haben wollte. Big Grin

Jetzt funktioniert es, wie es soll.
Ich vermute es lag daran, dass ich den Timeout nicht im Handle hatte, denn sonst habe ich es anfangs mal genau so gehabt.

Super, danke für deine Mühe!
Gruß Arne


RE: XMLHttpRequest zeitgesteuert mit setTimeout - tkausl - 23.11.2016

Schau mal ins Netzwerk-Tab. Wobei ich eher glaube, dass die Funktion "reload" wohl irgendwo überschrieben wird oder so, weil auch bei einem Fehler der Request irgendwann Fertig (DONE) ist.

So z.B. kann ich den Fehler nämlich reproduzieren: https://jsfiddle.net/kcv9bxLt/1/


RE: XMLHttpRequest zeitgesteuert mit setTimeout - Arne Drews - 23.11.2016

Ja, den Netzwerktab hatte ich grundsätzlich immer beobachtet, dort wurde nichts protokolliert. Keine Fehler, Warnungen, Hinweise... Ein Traum für jeden Entwickler. Big Grin
Da konnte man leider gar nichts erkennen.

Überschrieben hätte dort eigentlich auch nichts können, denn mehr als das, was ich i #1 gepostet habe, ist an JavaScript noch gar nicht vorhanden.

Aber nun läuft es ja, dank Deiner Hinweise.
Gruß Arne