Christian S.: (AJAX) Ein XMLHttpRequest Objekt für mehrere Anfragen verwenden?

Hi,

ich spiele gerade mit AJAX rum und frage mich, ob ich für jede Anfrage, die ich an einen Server mittels der send-Methode stelle, ein neues XmlHttpRequest erzeugen sollte.

oder kann ich mir einmal das objekt erzeugen, einmal das onreadystate event zuweisen und wenn ich was brauche, einfach nur die send methode aufrufen??

Ich dachte mir nur, dass es vielleicht Probleme geben könnte wegen der Asynchronität..., dass vielleicht die StateChanges nicht mehr richtig den Sends zugeordnet werden können.

Dachte mir das halt so:
Habe eine "Klasse" AJAX:

var ajax = new AJAX();

darin dann das XMLHttpRequest objekt instanzieren.
und ihm den onreadystatechange event zuweisen.

function AJAX()
{
 var xmlhttp = .....
 xmlhttp.onreadystatechange = function()
 {
   .....
   if(xmlhttp.status == 200)
   {
     if(this.onsucceed)
     {
       this.onsucceed(xmlhttp.responseText);
     }
   }
 }
}

dann, wenn ich es brauche:

ajax.onsucceed = machejenes;
ajax.send("id=1");
ajax.onsucceed = machediesunddas;
ajax.send("id=2");

function machediesunddas(response)
{
  alert(response);
}

Ich möchte dann halt wirklich, dass nach der Antwort vom ersten send auch machjenes aufgerufen wird, und für das zweite send machediesunddas.

Stelle mir halt vor, dass ich eine Anfrage schicke, in der Zeit wird die onsucceed methode auf einen anderen wert gesetzt und schon landet die response in der falschen methode.

Gehts besser? Also vermutlich für jede Anfrage ein Objekt?

Gruß
Christian

  1. Hallo,

    Was würde denn gegen eine neue instanzierung sprechen? Ich mache das manchmal so, dass ich gleich die callback funktion mit übergebe.

    function Client(url, callback) {
        var req = new XMLHttpRequest();

    req.onreadystatechange = function() {
            if (req.readyState == 4) {
                if ( req.status < 400 ) callback(req.responseText);
                else callback("Es gab ein Problem beim abrufen der Daten: " + req.status+ "/ " + req.statusText);
            }
        }
        req.open("GET", url, true);
        req.send(null);
    }

    Jeena

    1. Hi,

      naja, das man für jede Anfrage ein neues Objekt anlegen muss. Wird sicher nicht so schlimm sein, aber ich denke immer möglichst auf minimalen Aufwand/Resourcen hin...

      Und für jeden Request müsste dann auch die statechange methode neu zugewiesen werden.

      Muss das alles sein, frag ich mich nur...

      Gruß
      christian

      Hallo,

      Was würde denn gegen eine neue instanzierung sprechen? Ich mache das manchmal so, dass ich gleich die callback funktion mit übergebe.

      function Client(url, callback) {
          var req = new XMLHttpRequest();

      req.onreadystatechange = function() {
              if (req.readyState == 4) {
                  if ( req.status < 400 ) callback(req.responseText);
                  else callback("Es gab ein Problem beim abrufen der Daten: " + req.status+ "/ " + req.statusText);
              }
          }
          req.open("GET", url, true);
          req.send(null);
      }

      Jeena

    2. Hi,

      Was würde denn gegen eine neue instanzierung sprechen?

      IMHO nichts. *Für* eine Beibehaltung spräche aber die Nutzung von "persistent connections", wie es z.B. in PHP mit cURL geht.

      Gruß, Cybaer

      --
      Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  2. hi,

    ich spiele gerade mit AJAX rum und frage mich, ob ich für jede Anfrage, die ich an einen Server mittels der send-Methode stelle, ein neues XmlHttpRequest erzeugen sollte.

    Ja.

    oder kann ich mir einmal das objekt erzeugen, einmal das onreadystate event zuweisen und wenn ich was brauche, einfach nur die send methode aufrufen??

    Das gibt Probleme, es gibt ein paar Threads im Archiv, die darüber berichten.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }