Anne-Kathrin Peters: mehrere Requests

Beitrag lesen

Hallo liebe Wissende, ;)

ich versuche gerade eine Programmieraufgabe mit Ajax zu lösen. Ich "starte" einen Request um "Computer-Call"-Daten aus einer Datenbank in Form einer Tabelle auszugeben. In der ersten Spalte soll man über einen Klick auf eine Checkbox einen weiteren Request starten können, um die Details anzufordern (diese sind an einer anderen Stelle als die DB gespeichert).
Der Request ist asynchron, d.h. man kann, während der Request abgearbeitet wird, weitere Checkboxen anklicken, um die Details anzufordern. Das heißt, es sollen mehrere Requests losgeschickt werden können.
Diese "Herausforderung" wollte ich mit einer Queue lösen: Bevor ein Request gesendet wird, wird geprüft, ob der "aktuelle" Request fertig abgearbeitet ist, d.h. der Status des aktuellen Requests noch nicht 4 ist (also 1,2, oder 3). Wenn dem so ist, soll die Zieladresse des php-Skripts in einer queue-Variablen gespeichert werden.
Diese queue wird abgearbeitet, sobald der aktuelle Request fertig ist (Status = 4).

Eine Funktion klickt über eine Schleife alle Checkboxen an.
Im Firefox funktioniert das wunderbar. Alle Details werden nacheinander ausgegeben. Nur der Internet Explorer wehrt sich. Er scheint gar keine queue aufzubauen (queue länge über alert ausgegeben: = 0).

Hier mein Code:

queue = new Array(); //wird global erstellt
var detailrequest = new createRequest(); //wird global erstellt

function detailausgabe(callid, checkboxid) ermittelt ob checkbox gecheckt, wenn ja:
var ziel = "detailrequest.php?callid="+callid+"&checkboxid="+checkboxid;
sendDetailRequest(ziel);

function sendDetailRequest(ziel)
{
  if(detailrequest)
  {
    //falls der vorige Request noch nicht abgearbeitet, soll der neue
    // Request in eine Warteschlange eingefügt werden:
    if(detailrequest.readyState == 1 || detailrequest.readyState == 2
       || detailrequest.readyState == 3)
    {
      queueLength = queue.length;
      queue[queueLength] = ziel;
    }
    //es wird aktuell kein Request abgeabeitet. Das heißt, es kann
    //ein Request initialisiert werden (mit ziel s. Parameter)
    else
    {
      detailrequest.onreadystatechange = updateWithDetails;
      detailrequest.open( 'GET', ziel, true );
      detailrequest.send( null );
    }
  }
}

function updateWithDetails()
{
  if(detailrequest.readyState==4)
  {
    if(detailrequest.status == 200)
    {
      var response = detailrequest.responseText;
      makeDetailElement(response); // ergänzt die Detailzeile
    }
    else
      alert("Fehler: Request status is "+detailrequest.status);
      //soll das RequestObject aus dem Request Array entfernen
    queueLength = queue.length;
    if(queueLength > 0)
    {
      var ersterDetailRequest = queue[0];
      //Erstes Element entfernen, den Rest eine Position nach vorne
      //rücken
      queue.shift();
      sendDetailRequest(ersterDetailRequest);
    }
  }
}