hotti: Ajax Laufzeitproblem

hi,

s. Thema. Das Teil ist testweise online als

Talk

Prob.: Immer dann, wenn setInterval() alle 5 s greift und dabei gleichzeitig was geschrieben wird, geht der Request in die Hose. Mein erster Versuch ist es, mit 2 XHR-Objekten zu arbeiten, wird aber nichts.

Ideen? Haut mal rein und schaut Euch das bitte mal an.

viele Grüße,
Horst Schnatterente

  1. Ideen?

    das XHR-Objekt Funktionslokal machen, sonst überschreibst du dir das Objekt mit den neuen Daten bei  mehreren Requests gleichzeitig.

    1. Ideen?
      das XHR-Objekt Funktionslokal machen, sonst überschreibst du dir das Objekt mit den neuen Daten bei  mehreren Requests gleichzeitig.

      Uih, das muss ich mal überschlafen ;-)
      Danke!!!

      Horst

      --
      Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  2. Moin,

    s. Thema. Das Teil ist testweise online als

    Talk

    Die RaceCondition hab ich beseitigt, danke schonmal. Die RC gibts nur noch, wenn zu oft kurz hintereinander Enter gedrückt wird, das werde ich serverseitig lösen (irgendwann).

    Jetzt haben wir noch das "Flackern" (danke für den Hinweis), bei jedem setInterval-Reload wird die Liste gelöscht und neu geschrieben, um das zu beseitigen sehe ich 2 Möglichkeiten:

    1- die <ul id='talk'> nur dann neu schreiben, wenns was Neues gibt, dazu ein Zweites temp. array Clientseitig führen

    2- die Chat-Liste einmal schreiben beim Starten und jeden neuen Eintrag dranhängen

    Ich lass mir das mal durch den Kopf gehen, Hinweise dazu lese ich auch gerne.

    Viele Grüße,
    Horst SmallTalker

    1. Die RaceCondition hab ich beseitigt, danke schonmal. Die RC gibts nur noch, wenn zu oft kurz hintereinander Enter gedrückt wird, das werde ich serverseitig lösen (irgendwann).

      Den Code hast du jetzt aber doppelt dort stehen und das Problem ist immer noch vorhanden, nämlich wenn man einen 2. Request startet während noch ein vorheriger läuft.
      Findest du nicht, dass es einfacher gewesen wäre, das XHR-Objekt lokal zu legen?

      function talkoutRequest(){  
        var xmaob = mob();  
        var url = "/cgi-bin/talk.cgi?talkout=1";  
        
        function talkout(){  
          if(xmaob.readyState == 4){  
            if(xmaob.status == 200){  
              var meta = xmaob.responseXML.getElementsByTagName('meta');  
              showTalk(meta);  
            }  
            else{  
              alert('Problem mit ajax beim Abholen der Daten');  
            }  
          }  
        }  
        
        xmaob.open("GET", url, true);  
        xmaob.onreadystatechange = talkout;  
        xmaob.send(null);  
      }
      

      Im anderen Request genauso vorgehen.

      1. Die RaceCondition hab ich beseitigt, danke schonmal. Die RC gibts nur noch, wenn zu oft kurz hintereinander Enter gedrückt wird, das werde ich serverseitig lösen (irgendwann).
        Den Code hast du jetzt aber doppelt dort stehen und das Problem ist immer noch vorhanden, nämlich wenn man einen 2. Request startet während noch ein vorheriger läuft.
        Findest du nicht, dass es einfacher gewesen wäre, das XHR-Objekt lokal zu legen?

        Ja, danke, das teste ich gerade, geht ja prima!!!
        Ähm, wenn das XHR-Objekt jedesmal neu erstellt wird, läuft da irgendwann was über?? (Puffer, Mülleimer, RAM...)

        Btw., hab das Senden nun auch auf POST umgestellt. Muss ja nicht jeder im Log mitlesen können ;-)

        Horst

        1. Ähm, wenn das XHR-Objekt jedesmal neu erstellt wird, läuft da irgendwann was über?? (Puffer, Mülleimer, RAM...)

          Also ich würde erst mal nicht davon ausgehen. Wenn du es genau wissen willst, beobachte einfach mal den Speicher über eine gewisse Zeit. (im IE würde ich anfangen)

          1. Ähm, wenn das XHR-Objekt jedesmal neu erstellt wird, läuft da irgendwann was über?? (Puffer, Mülleimer, RAM...)
            Also ich würde erst mal nicht davon ausgehen. Wenn du es genau wissen willst, beobachte einfach mal den Speicher über eine gewisse Zeit. (im IE würde ich anfangen)

            Ok, danke!

            Nun aber was ganz komisches, wenn ich auf POST umstelle funktioniert das Script mit Mozilla auf dem onlineServer nicht, lokal jedoch schon. auf beiden Servern gehts mit IE und Post.

            Mit Mozilla gehts auf beiden Servern nur mit GET.

            GET also

              
            var url = "/cgi-bin/talk.cgi?talk=1;msg=" + msg;  
            maob.open("GET", url, true);  
            maob.send(null);  
            
            

            POST

              
            var url = "/cgi-bin/talk.cgi";  
            maob.open("POST", url, true);  
            maob.send("talk=1;msg=" + msg);  
            
            

            Hier bin ich echt ratlos. Ideen??

            Hotte

            --
            Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
            1. xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

              1. xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

                Habsch mir doch gedacht, dass ich da auch noch was fummeln muss.

                Herzlichen Dank!!

                Ungeprüft, das wars bestimmt ;-)

                Cigar!

                Hotte

                --
                Den Chat hab ich für meine Frau geschrieben.
    2. Moin,

      s. Thema. Das Teil ist testweise online als

      Talk

      Hmm,

      Wenn ich charset auf UTF-8 umstelle, will der IE nicht mehr posten.

      Was kann das schon wieder sein? In der Zeile die IE bemängelt steht

      <input type="button" ....> Eingabeformular. Fehler Objekt erwartet.

      Dankbar für Hinseise,
      Rolf

      1. Moin,

        saudummer Fehler, der gar keiner war. Es war eine Kommentarzeile im Scriptbereich in der ein 'ü' geschrieben stand. Schwer zu finden, wenn alle Browser tun und nur der IE nicht mit einer absolut nichtssagenden Meldung "Objekt erwartet".

        Talk with me in UTF-8

        Hab zwei Tage gebraucht um das rauszufinden ;-)

        Viele Grüße,
        Horst Schlemmerschnitte

  3. s. Thema. Das Teil ist testweise online als

    Talk

    Prob.: Immer dann, wenn setInterval() alle 5 s greift und dabei gleichzeitig was geschrieben wird, geht der Request in die Hose. Mein erster Versuch ist es, mit 2 XHR-Objekten zu arbeiten, wird aber nichts.

    Ideen? Haut mal rein und schaut Euch das bitte mal an.

    Ich glaub ich hab dir das schon beim letzten mal versucht zu erklären.

    Du musst aufpassen bei AJAX, dass du einen Request nicht überschreibst bzw. neu anstößt, wenn der alte noch nicht abgearbeitet wurde. Es sei denn du brichst ihn ganz offiziell ab.

    Wenn du dieses Problem beseitigst, brauchst du auch nicht mehrere Requestobjekte, sondern kannst immer mit dem selben arbeiten.

    Struppi.

    1. hi,

      Du musst aufpassen bei AJAX, dass du einen Request nicht überschreibst bzw. neu anstößt, wenn der alte noch nicht abgearbeitet wurde. Es sei denn du brichst ihn ganz offiziell ab.

      Ja, Klar. Habe verstanden.

      Wenn du dieses Problem beseitigst, brauchst du auch nicht mehrere Requestobjekte, sondern kannst immer mit dem selben arbeiten.

      Wie machst Du das?

      Horst

      1. Wenn du dieses Problem beseitigst, brauchst du auch nicht mehrere Requestobjekte, sondern kannst immer mit dem selben arbeiten.

        Wie machst Du das?

        Was? Mit dem selben Objekt arbeiten? Oder das Problem beseitigen?

        Struppi.

        1. Wie machst Du das?

          Was? Mit dem selben Objekt arbeiten? Oder das Problem beseitigen?

          Genau das ;-)

          Vermutlich fragst Du xhr.readyState ab. Das guck ich mir gleich mal an. Hoffentlich finde ich das, hab nämlich kein Geld um dicke Bücher zu kaufen wo das vielleicht drinstehen könnte. Aber evntl. hilfst Du mir nochmal.

          Viele Grüße,
          Horst Teichhofer

          1. Wie machst Du das?

            Was? Mit dem selben Objekt arbeiten? Oder das Problem beseitigen?

            Genau das ;-)

            Vermutlich fragst Du xhr.readyState ab.

            Nein, du musst - wenn du nicht Objektorientiert arbeitest - einen Flag benutzen, der den aktuellen Status des httpRequest Objektes anzeigt. Und je nach Status, darfst du dann keinen neuen Request absetzen.

            Struppi.

            1. hi,

              Nein, du musst - wenn du nicht Objektorientiert arbeitest - einen Flag benutzen, der den aktuellen Status des httpRequest Objektes anzeigt. Und je nach Status, darfst du dann keinen neuen Request absetzen.

              Auch schon getestet und prompt einen deadlock eingehandelt ;-)

              Danke Dir,
              im Moment läuft das Teil,

              Horst Schlumpi