Ajax-Request Probleme

  • Hallo zusammen. Ich weiß, es ist Weihnachten, aber vielleicht ist ja doch einer da, der mir das erklären kann ;)

    Der Code, also die wichtigen Bestandteile...

    So, das Problem:

    Rufe ich sync() auf, dann geht alles wunderbar. Die Logs in der Console kommen, der Wert im HTML wird ersetzt.

    Rufe ich danach resync() auf, dann wird es komisch. sync.php wird abgerufen und auch vollständig übertragen. Aber sämtliche Log-Einträge fehlen und der HTML-Wert wird nicht ersetzt. Verstehe ich schon mal gar nicht, denn die Funktion AjaxRequest ist ja die gleiche, die vorher noch Logeinträge geschrieben hat. Auch sync und resync sind im Grunde identisch.

    So, gehe ich nun her und kopiere die Funktion AjaxRequest und erzeuge daraus eine neue AjaxRequestNEU, also identische Funktionen, nur verschiedene Namen und ändere gleichzeitig in resync() den Funktionsaufruf auf AjaxRequestNEU, dann geht alles !?!?! Dann kann ich sync aufrufen und danach so oft ich will auch resync. Alles läuft dann normal.

    Nur warum?

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Wird der Ajax Request gecached? Dann einfach ein microtime anhängen an den sync.php AJAX call und Du bist das Problem los. Oder eben anders das cachen verhindern - z.B. severseitig beim Response Header des AJAX Call Ziels.

  • Hi Chris,

    leider nein, das Ergebnis kommt nicht aus dem Cache. Hatte ich auch schon gedacht, kann ich aber 100% ausschließen. Das Ergebnis der Abfrage selbst ist ein JSON-Objekt mit einem Microtime und das ist immer ein anderer. Den Inhalt der Abfrage sehe ich in der Console, aber eben nur das und nur da.

    Und wie gesagt, das ist ja das Komische. Rufe ich mit sync() -> AjaxRequest() auf und mit resync() -> AjaxRequestNEU(), dann geht es ja und ich sehe die korrekten Werte auf der Webseite. Beide AjaxRequest und AjaxRequestNEU sind dann aber halt identische Kopien und beide rufen die sync.php auf.

    Mal als Beispiel, Funktionen aber gekürzt (sind aber die von oben)

    Erstaufruf laut Console

    Log: 1
    Log: 3
    GET XHR Request Status 200
    Log: 4
    Log: 2

    Passt also

    Rufe ich das dann noch mal auf oder per resync, dann kommt nur

    Log: 1
    GET XHR Request Status 200

    Alles innerhalb von "AjaxRequest", also Logs, inkl. dem "Log 3" und der weitere Programmcode "verschwindet". Dennoch scheint er request.open und request.send aber auszuführen, denn der XHR-Request wird ja erkannt und ausgeführt.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • D.h. der readyState ist weder 2 noch 4.

    Mach aus

    Code
    request.onreadystatechange = function()     {         if (request.readyState == 2)         {

    mal:

    Code
    request.onreadystatechange = function()     {      console.log("ReadyState: " +request.readyState);         if (request.readyState == 2)         {

    PS: Dieses Forum formatiert ja richtig sch... grmpf. Aber ich glaube, Du kannst erkennen, was ich meine.

  • Hi Chris, also wenn ich es richtig gesehen habe, dann ist das nur ein neuer Log-Eintrag.

    So, beim Erstdurchlauf sagt mit die Console dazu:

    function sync aufgerufen
    setze request ab
    AjaxRequest
    ReadyState: 1
    GETXHR [HTTP/1.1 200 OK 31ms]
    ReadyState: 2
    jetzt5 1514387825191
    ReadyState: 3
    ReadyState: 4
    Offset 1751

    Der Inhalt vom Request ist: 1514387982343

    Und nun rufe ich sync() noch mal auf.

    function sync aufgerufen
    setze request ab
    GETXHR [HTTP/1.1 200 OK 33ms]

    Der Inhalt vom Request ist: 1514388057311

    Und wie sieht man? Dein readyState wurde nicht geloggt, noch nicht mal der String "ReadyState: "

    Anmerkung zu den Logs:

    console.log('function sync aufgerufen');
    console.log('setze request ab');
    und
    console.log('Offset '+ offset);

    stehen in function sync(). Letztere nach nach Request, also der Callback.

    In der function AjaxRequest() stehen

    gleich am Anfang, erste Zeile, also vor dem Request
    console.log('AjaxRequest');

    und innerhalb von onreadystatechange stehen
    console.log("ReadyState: " +request.readyState);
    console.log('jetzt5 '+requestJetzt);

    Aber ich sage ja, ich bin zu doof für Javascript. Mache da nun schon seit Samstag rum und werde nicht schlau draus. Vor allem nicht, warum es geht, wenn ich die "function AjaxRequest(uri,callback)" verdopple und eben beide Funktionen aufrufe.


    P.S: Wegen Forum und Code. Du musst den vorher in einen Editor kopieren und dann einfügen. Direkt aus der Forenseite kopieren geht nicht, da werden alle Einzüge zerschossen.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Ach ja, bevor da wichtige Infos von mir fehlen.... Der nachträgliche sync wird manuell ausgelöst, also durch einen Klick auf einen Link. Auch da schon mehrere Versionen versucht.

    Per "href="javascript:sync();"", "onclick="sync();"" und mit einem Eventlistener "click" auf den Text. Auch schon versucht das globale This zu binden und zu verwenden. Liefert alles genau das gleiche Ergebnis. Geht nur, wenn ich zwei identische, aber unterschiedlich benannte Ajax-Funktionen nutze.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Ja aber dann müsste doch wenigstens das "console.log('AjaxRequest');" kommen, denn das kommt da davor, oder? Also bevor der XMLHttpRequest überhaupt aufgemacht wird.

    Wie gesagt, ich raffe hier nix mehr. Habe mir nun ein fertiges Script genommen und getestet. Geht. Habe das nun zu 99% umgebaut auf meines und es geht noch immer.... Du glaubst gar nicht, wie was von ich am Bahnhof bin.... Gestern "Honig im Kopf". So wie der Opa stehe ich auch gerade da....

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Fehler eingegrenzt.... Das Inline-Script kollidiert anscheinend mit einem anderen Script. Habe die Seite nun komplett nachgebaut über das Test-Script. Geht. Sobald mein eigenes JS dabei ist, geht nix mehr.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Ok, ganz dumm gelaufen. Ist echt mein externes Script. Die Funktion AjaxRequest gibt es doppelt. Eigentlich ja kein Problem, aber ich nutze nun auch ReadyState 2, das aber nicht im externen Script. Klar, dann geht der Erstaufruf, denn das externe gibt es noch gar nicht, wird per async nachgeladen. Der manuelle Aufruf geht dann auch, die Console schrieb das schon richtig, aber der Request wird nicht vom Inline-Script abgesetzt, sondern vom externen und da gibt es gar keine Log-Anweisungen. Zudem schlägt der Callback ohne Fehlermeldung fehl, also auch keine Textänderung im HTML ;)

    Ich sage nur HILFE.... So ein Kindergarten und dann sieht man den Fehler einfach nicht und sucht an allen möglichen anderen Stellen ;)

    Danke Chris !

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(