gustl319: Opera/Safari3 und ClearTimeout

Hi,

ich habe eine Anwendung die periodisch (ca. alle 100ms) Daten von einem Server holt. Wenn die Verbindung abbricht kommen natürlich keine Daten mehr. Irgendwann kommt die Verbindung wieder und dann soll auch die Datenübertragung wieder neu anlaufen.

Um das zu erreichen arbeite ich mit 2 Timern. Einer (timerReq2) läuft mit 100ms-Verarbeitungszeit=50ms und triggert neue Datenanfragen mit XMLHttpRequest(). Direkt vor dem XMLHttpRequest() wird noch schnell ein anderer Timer (timerReqC) mit 2s als Timeout gestartet. Bekommt der XMLHttpRequest() eine Antwort, wird der 2s-Timeout mit clearTimeout gelöscht und ein neuer 50ms Timer gestartet.

Das funktioniert mit vielen Browsern (Firefox, Chrome, IE8, Safari4), aber leider mit Opera und Safari3 nicht! Die Fehlerkonsole vom Opera liefert keine Anzeige.

Vielleicht könnt Ihr mir weiterhelfen? Hier ist mein gekürzter Code:

  
var xmlhttp;  
  
  
function loadXMLDoc2(url, content) {  
  xmlhttp=null;  
  
  if (parent.XMLHttpRequest) {  
    xmlhttp=new XMLHttpRequest();  
  } else if (parent.ActiveXObject) {  
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  
  }  
  if (xmlhttp!=null) {  
    xmlhttp.onreadystatechange=state_Change2;  
    xmlhttp.open("POST",url,true);  
    xmlhttp.send(content);  
  } else {  
    alert("Your browser does not support XMLHTTP.");  
  }  
}  
  
function state_Change2() {  
  if (xmlhttp.readyState==4) {  
    stopXmlReqC();  
    if (xmlhttp.status==200) {  
      timerReq2=setTimeout('newXmlReq2()', 50);  
    }  
  }  
}  
  
var timerReq2 = null;  
  
function stopXmlReq2() {  
  clearTimeout(timerReq2);  
}  
  
function newXmlReq2() {  
  startXmlReqC();  
  loadXMLDoc2("../../cgi-bin/collect2",askstring);  
  askstring="";  
}  
  
var timerReqC = null;  
  
function stopXmlReqC() {  
  clearTimeout(timerReqC);  
}  
  
function startXmlReqC() {  
  timerReqC=setTimeout('newXmlReqC()', 2000);  
}  
  
function newXmlReqC() {  
  alert('timeout');  
  xmlhttp.abort();  
  timerReq2=setTimeout('newXmlReq2()', 100);  
}  

  1. Hi,

    ich habe eine Anwendung die periodisch (ca. alle 100ms) Daten von einem Server holt. Wenn die Verbindung abbricht kommen natürlich keine Daten mehr. Irgendwann kommt die Verbindung wieder und dann soll auch die Datenübertragung wieder neu anlaufen.

    Um das zu erreichen arbeite ich mit 2 Timern. Einer (timerReq2) läuft mit 100ms-Verarbeitungszeit=50ms und triggert neue Datenanfragen mit XMLHttpRequest(). Direkt vor dem XMLHttpRequest() wird noch schnell ein anderer Timer (timerReqC) mit 2s als Timeout gestartet. Bekommt der XMLHttpRequest() eine Antwort, wird der 2s-Timeout mit clearTimeout gelöscht und ein neuer 50ms Timer gestartet.

    Das funktioniert mit vielen Browsern (Firefox, Chrome, IE8, Safari4), aber leider mit Opera und Safari3 nicht! Die Fehlerkonsole vom Opera liefert keine Anzeige.

    Das Problem ist, das clearTimeout den Timer nicht löscht. Nach 2 Sek. wird also trotzdem die Funktion newXmlReqC() gestartet.

    1. Das Problem ist, das clearTimeout den Timer nicht löscht. Nach 2 Sek. wird also trotzdem die Funktion newXmlReqC() gestartet.

      Dann machst du etwas falsch. Mein Safari kann einen Timeout stoppen.

      Ich hab mir aber dein Konstrukt nicht genau angeschaut, es ist aber auf jeden Fall nicht optimal. Dass du das xmtlHTTP Objekt ständig überschreibst und neu erzeugst ist ungünstig und führt auch im IE zu Problemen. Du kannst es ohne Probleme mehrfach verwenden, aber du darfst es auf keinen Fall überschreiben solange der Request noch nicht vollständig abgearbeitet ist.

      Das der Server ab und zu hängt ist aber auch kein Wunder, wenn du ihn derart mit abfragen bombadierst. Auch bin mir nicht sicher ob die Logik deines Ablaufs überhaupt zu einem sinnvollen Ergebnis führt. Hier laufen alle Timer und Events kreuz und quer ohne sinnvollen abfragen.

      Struppi.