Christoph Paulus: AJAX: NS_ERROR_NOT_INITIALIZED

Hallo Leute!

Ich habe ein kleines/großes Problem mit AJAX. Ich habe auch schon gegoogelt, habe aber keinen Lösungsvorschlag gefunden.

Und zwar möchte ich mit AJAX/JavaScript eine Datei auslesen. Ich habe schon vor langer Zeit für mein Projekt ein Script geschrieben, welches von allen meinen Browsern (Opera, Firefox, Netscape und IE) ohne Probleme akzeptiert und ausgeführt wurde.
Nun habe ich die Seite aber ein bisschen aufgebessert, die Grundstruktur des Scripts wurde aber beibehalten. Doch plötzlich liefern Firefox und Netscape folgenden Fehler zurück:

Fehler: uncaught exception: [Exception... "Component returned failure code: 0xc1f30001 (NS_ERROR_NOT_INITIALIZED) [nsIXMLHttpRequest.send]"  nsresult: "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)"  location: "JS frame :: http://localhost/liveflight/?site=aktuellefluege :: WertAuslesen :: line 182"  data: no]

Das Ausleseprozedur (ich will das ganze Script aus Platzgründen nicht näher erläutern) wird über ein
window.setInterval("WertAuslesen()",5000);
alle 5 Sekunden ausgeführt. Das komische ist, dass die obrige Meldung manchmal kommt und manchmal auch nicht, es kann also sein, dass alles eine Minute lang einwandfrei funktioniert, plötzlich aber ein leeres Ergebnis, bzw. der Fehler zurückgegeben wird. 15 Sekunden später funktioniert es aber wieder.

Hier die "Problemstelle". Die betroffene Zeile (182) ist "XMLHTTP.send(null);"

function WertAuslesen() {
  var jetzt = new Date();
  var a = jetzt.getTime();

XMLHTTP.open("GET", "secure/test.txt?a="+a);
  XMLHTTP.onreadystatechange = WerteAusgeben;
  XMLHTTP.send(null);
}

Hat jemand von euch vielleicht eine Idee?

  1. Hallo,

    Ich hatte vor ein paar Tagen das gleiche Problem, das liegt daran, dass Firefox und Netscape eine alte xmlhttp-Abfrage nicht wie die anderen Browser abbrechen, wenn eine neue kommt, sondern diesen Fehler ausgeben.

    Ich find leider grad nicht mehr die Seite, wo ich das her hab, aber als Lösung kannst du dir eine Variable nehmen, die angibt, ob gerade eine Anfrage bearbeitet wird (die also beim Senden auf true und bei Empfangen auf false gesetzt wird) und vor dem Senden gucken, ob diese Variable true ist, und dann manuell abbrichst, so in etwa:

    var wirdgeladen = false;
    function WertAuslesen() {
       var jetzt = new Date();
       var a = jetzt.getTime();

    if(wirdgeladen)
       {
          XMLHTTP.onreadystatechange = function(){}; // beim Abbrechen wird onreadystatechange ausgelöst
          XMLHTTP.abort();
       }
       XMLHTTP.open("GET", "secure/test.txt?a="+a);
       XMLHTTP.onreadystatechange = WerteAusgeben;
       wirdgeladen = true;
       XMLHTTP.send(null);
     }
    function WerteAusgeben()
    {
       wirdgeladen = false;
       ...
    }

    1. Also: Der Tipp hat mich eigentlich nicht weitergebracht, da es noch immer nicht funktioniert, auf der anderen Seite hat er mir aber sehr geholfen.

      Konkret: Die Fehlermeldung ist weg, ich bekomme aber abundzu noch immer ein leeres Ergebnis zurück.
      Betonung auf "abundzu", wie bereits erwähnt, funktioniert es 2 Durchgänge ohne Probleme, die Daten werden angezeigt. Dann funktioniert es mal 5 Durchgänge nicht um daraufhin wieder 4 Durchgänge zu funktionieren.

      Hast du dazu vielleicht noch eine Idee?

      1. Hallo,

        für mich ist es nicht so sinnig, einen laufenden Request abzubrechen, nur um wieder die (gleiche? ) Abfrage zu starten.

        Wäre es nicht effektiver, erstmal das ausstehende Ergebnis abzuwarten und dann erst einen neuen Request zu starten.

        Gruß plan_B

        --
             *®*´¯`·.¸¸.·
      2. Also: Der Tipp hat mich eigentlich nicht weitergebracht, da es noch immer nicht funktioniert, auf der anderen Seite hat er mir aber sehr geholfen.

        Konkret: Die Fehlermeldung ist weg, ich bekomme aber abundzu noch immer ein leeres Ergebnis zurück.
        Betonung auf "abundzu", wie bereits erwähnt, funktioniert es 2 Durchgänge ohne Probleme, die Daten werden angezeigt. Dann funktioniert es mal 5 Durchgänge nicht um daraufhin wieder 4 Durchgänge zu funktionieren.

        Hast du dazu vielleicht noch eine Idee?

        Hmm - eigentlich dürfte es ja gar kein leeres Ergebnis geben, wenn du die unvollständigen Anfragen abbrichst und davor den onreadystatechange wegnimmst...
        Ich weiß ja nicht worum es in deinem Script geht, aber wenn du natürlich jede einzelne der Anfragen brauchst und nicht auf eine zwischendrin verzichten kannst, wäre denk ich die einzige Lösung, dass du mehrere xmlhttp-Objekte erstellst und die dann immer abwechselnd laden lässt, so dass sie mehr Zeit dazu haben.

        1. Ja, das komische ist ja auch, dass im "alten" Script immer alles ohne Probleme funktioniert hat, und das "neue" Script besteht grundlegend aus dem "alten".

          Ich glaub ich werd nachher (nicht "morgen", der ist ja schon ;) ) mal alles Stück für Stück zerlegen, bis es wieder funktioniert.
          Werde dann Bericht erstatten ;)

          1. Hab das Problem gelöst:
            Parallel zum Datei-Auslese-Intervall lief noch ein anderes Intervall. Das mochte AJAX aber irgendwie nicht. Da beide Funtkionen in den gleichen Zeitabständen aufgerufen werden, hab ich sie unter einem Intervall zusammengefasst und schon bekomme ich immer ein Ergebnis zurückgeliefert :)

            Danke für eure Hilfestellung und Mühe!

            1. Hello,

              Parallel zum Datei-Auslese-Intervall lief noch ein anderes Intervall. Das mochte AJAX aber irgendwie nicht. Da beide Funtkionen in den gleichen Zeitabständen aufgerufen werden, hab ich sie unter einem Intervall zusammengefasst und schon bekomme ich immer ein Ergebnis zurückgeliefert :)

              Lief da ein weiterer Request parallel?
              Dann kann es daran liegen, dass der Browser nur zwei Connections zur gleichen Domain zur gleichen Zeit aufbaut. Die meisten sind da auf zwei limitiert, manche haben auch acht als Default.

              Harzliche Grüße aus
              Sankt Andreasberg
              und Guten Rutsch

              Tom

              --
              Nur selber lernen macht schlau