Rolf B: Javascript und XMLHttpRequest

Beitrag lesen

Hallo pl,

wenn Du meinst, dass man an das XmlHttpRequest Objekt Fremddaten anklebt - ja, kann man machen. Ist aber eigentlich nicht nötig.

Piet schrieb:

Wenn ich über httpRequest.open("get",ip_adresse[i] + "?" + var_name[i],true); im asynchron-Modus die Daten hole, kann ich dem callback-Programm einen Parameter mitgeben ?

Beispiel: httpRequest.onreadystatechange = updatePage(schleifenzaehler); Wäre so etwas möglich, damit ich weiß welcher callback-Aufruf zu welchem Parameter/IP-Satz gehört ?

Das ist eigentlich genau die richtige Idee, aber vielleicht nicht so gemeint gewesen. Wichtig zu wissen ist, dass JavaScript die updatePage-Funktion beim Registrieren des Eventhandlers aufruft, und nicht beim Ändern des readystate. Das ist aber gerade gut so. Der Trick für richtiges Funktionieren ist, dass updatePage eine Funktion höherer Ordnung sein muss, d.h. eine Funktion, die eine Funktion als Ergebnis zurückgibt. Diese Funktion ist dann der readystatechange-Eventhandler.

   for (let i=0; i<10; i++) {
      let req = new XmlHttpRequest();
      req.onreadystatechange = updatePage(req, i);
      req.open(...);
      req.send(...);
   }

// und anderswo

   function updatePage(request, nummer) {
      return function() {
         // arbeite mit request und nummer
      }
   }

Ich habe tatsächlich keine zuverlässige Quelle gefunden, die angibt, ob der readystatechange-Handler garantiert bestimmte Parameter bekommt, oder ob er in this einen bestimmten Wert vorfindet. Manche erwarten, dass das request-Objekt in this steht, andere erwarten, dass es als erster Parameter übergeben wird. Eine andere Quelle bestritt, dass es irgendwelche Garantien gäbe. Darum bin ich den sichersten Weg gegangen: Ich gebe Request UND Nummer in die updatePage-Funktion hinein.

Auf diese Weise wird bei jedem Schleifendurchlauf eine neue Closure gebildet, die den Request und den Schleifenzählerstand enthält, und innerhalb dieser Closure läuft dann die zurückgegebene Funktion ab, kann das Event behandeln und hat den korrekten Request und den korrekten Schleifenzähler zur Verfügung.

Rolf

--
sumpsi - posui - clusi