tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
317
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von zoku2020
    zoku2020 zoku2020 ist offline Mitglied Bronze
    Registriert seit
    Jan 2003
    Ort
    Hannover (NDS)
    Beiträge
    48
    Hallo,

    ich schreibe grade an einem Chat, den ich mit AJAX, PHP und MySQL realisiere.
    Leider stehe ich vor folgendem Problem: Wenn ich einen Request absetze, der neue Nachrichten vom Server holen soll, bleibt das Script kurz bei readyState 1 und 2, und wenn eine oder mehr Nachrichten übermittelt werden auch bei 3 hängen. Allerdings werden Nachrichten, die in dieser Zeit zum Server übermittelt werden einfach übergangen beim nächsten Abfragen. Leider stehe ich auf dem Schlauch, was die Lösung dieses Problems angeht.

    Vielleicht überblickt das ja einer von Euch (ich bin AJAX-Anfänger). Für Hilfe wäre ich sehr dankbar.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    
    var http_request = false;
     
        function request_msgs() {
     
            http_request = false;
     
            if (window.XMLHttpRequest) { // Mozilla, Safari,...
                http_request = new XMLHttpRequest();
                if (http_request.overrideMimeType) {
                    http_request.overrideMimeType('text/xml');
                    // zu dieser Zeile siehe weiter unten
                }
            } else if (window.ActiveXObject) { // IE
                try {
                    http_request = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (e) {
                    try {
                        http_request = new ActiveXObject("Microsoft.XMLHTTP");
                    } catch (e) {}
                }
            }
     
            if (!http_request) {
                alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
                return false;
            }
            http_request.onreadystatechange = writemsg;
            http_request.open("POST", "scripts/messages.php", true);
            http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            http_request.send("send=false");
            
            setTimeout("request_msgs();", 2000);
     
        }
     
        function writemsg() {
            if(http_request.readyState == 4){
                if(http_request.status == 200){
                    var response = http_request.responseXML;
     
                    table = document.getElementById("text_messages");
                
                    if(response != null){
                        var messages = response.getElementsByTagName("message");
                        for(var i = 0; i < messages.length; i++){
                            var tr = document.createElement("tr");
                            var td = document.createElement("td");
                            td.appendChild(document.createTextNode("content"));
                            
                            td = td.cloneNode(true);
                            td.firstChild.nodeValue = messages[i].getAttribute("user") + ": ";
                            tr.appendChild(td);
                        
                            td = td.cloneNode(true);
                            td.firstChild.nodeValue = messages[i].getElementsByTagName("text")[0].firstChild.nodeValue;
                            tr.appendChild(td);
                    
                            table.appendChild(tr);
                        }
                    }
                }
            }else{
                var tr = document.createElement("tr");
                var td = document.createElement("td");
                td.appendChild(document.createTextNode("content"));
                            
                td = td.cloneNode(true);
                td.firstChild.nodeValue = "System: ";
                tr.appendChild(td);
                        
                td = td.cloneNode(true);
                td.firstChild.nodeValue = "Übertragungsfehler! Nummer: " + http_request.readyState;
                tr.appendChild(td);
                    
                table.appendChild(tr);
            }
        }
     
    Der Mittelfinger ist der vierte Finger an der Hand, egal wo ich zu zählen anfange.

  2. #2
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Moin,

    Das ist so eine Sache mit AJAX....vor allem mit dem A (asynchron)

    Das bedeutet ja, das im Gegensatz zum sonsigen JS-Verhalten mehrere Sachen parallel abgearbeitet werden können, und das ist der Knackpunkt:

    Du hast da nicht nur 1 Request am Laufen, sondern höchstwahrscheinlich mehrere nebeneinander.

    Eine Lösung könnte so aussehen:
    Beende bevor du einen neuen Request startest erst den alten(das geht über die Methode abort() )

    Dann gibt es noch ein Performance-Gesichtspunkt: so, wie es aussieht, erzeugst du ja jedesmal eine Tabelle mit allen Nachrichten....und musst auch jedesmal alle Daten holen und versenden.
    Günstiger wäre es bspw., wenn du beim Request z.B die ID der zuletzt erhaltenen Nachricht mit verarbeitest...du könntest diese dann beim Request mitsenden und müsstest nur die neuen Nachrichten verarbeiten, statt jedesmal alle.
     

Ähnliche Themen

  1. hänger bei readystate 1
    Von ruNN0r im Forum Javascript & Ajax
    Antworten: 5
    Letzter Beitrag: 21.12.10, 00:08
  2. xmlobj.readyState hat nur nach Useraktivität den Wert 4
    Von chofer02 im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 14.11.05, 21:26
  3. xmlhttp.readyState == 4 && xmlhttp.status == 200 ==> FEHLER!
    Von chofer02 im Forum Javascript & Ajax
    Antworten: 10
    Letzter Beitrag: 22.08.05, 02:24
  4. Verzögerung und asx!
    Von Kajotex im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 0
    Letzter Beitrag: 07.11.03, 17:10
  5. verzögerung
    Von erzwo im Forum Flash Plattform
    Antworten: 2
    Letzter Beitrag: 17.04.02, 01:05