Gültigkeit eines Arrays in einer Funktion/ Schleife

SonMiko

Erfahrenes Mitglied
Hallo zusammen,

ich habe anhand folgenden, simplen Codes, eine XML Datei ausgelesen - bzw. eingelesen
Code:
stop();
var myXML_xml= new XML();
myXML_xml.ignoreWhite=true;
myXML_xml.load("xml.xml");
myXML_xml.onLoad=function(success){
	xmlKunde=[];
	xmlBeschreibung=[];
	if(success){
		for(var i=0;i<myXML_xml.firstChild.childNodes.length; i++){
			xmlKunde[i]=myXML_xml.firstChild.childNodes[i].attributes.kunde;
			xmlBeschreibung[i]=myXML_xml.firstChild.childNodes[i].attributes.beschreibung;
		}
	}
	
}

Leider jedoch, kann ich nicht auf die Inhalte der Arrays "xmlKunde" sowie "xmlBeschreibung" außerhalb der letzten geschweiften Klammer zugreifen.
Woran liegt das? Gibt es eine Möglichkeit, das Array GLOBAL verfügbar zu machen?
Oder ist es aus Speicherplatz-Gründen nicht möglich?

Besten Gruß und Danke,

Mike
 
Hallo,
versuchs mal so:

Code:
stop();
xmlKunde = [];
xmlBeschreibung = [];
var myXML_xml = new XML();
myXML_xml.ignoreWhite = true;
myXML_xml.load("xml.xml");
myXML_xml.onLoad = function(success) {
	if (success) {
		for (var i = 0; i<myXML_xml.firstChild.childNodes.length; i++) {
			xmlKunde[i] = myXML_xml.firstChild.childNodes[i].attributes.kunde;
			xmlBeschreibung[i] = myXML_xml.firstChild.childNodes[i].attributes.beschreibung;
		}
	}
	go();
};
function go() {
	trace(xmlKunde);
	trace(xmlBeschreibung);
}
 
Aber damit mache ich die Variablen doch nicht "global" verfügbar, oder?
Generell wäre wichtig zu erfahren, ob die Variablen wirklich nur zur Laufzeit Gültigkeit haben... Also in der Funktion/ Schleife...
 
Hi,

die Variable sollte (wenn Du in der Funktion nicht das Schlüsselwort "var" verwendest) generell auf der gesamten Zeitleiste verfügbar sein. Sicherheitshalber solltest Du die Variable "xmlKunde" allerdings ausserhalb der onLoad-Methode deklarieren.

Dein Problem wird vielmehr sein, dass das Laden externer Daten in Flash asynchron abläuft - wenn Du von ausserhalb der Funktion "onLoad" auf Inhalte der XML-Datei zugreifen willst, ist sie höchstwahrscheinlich noch gar nicht geladen:
Code:
var foo = 0;

myxml.load("foo.xml");

myxml.onLoad = function() {
  foo = 1;
}

trace(foo); // Ausgabe: 0
Alles, was Du mit Deinem Array anstellen willst, musst Du daher von der onLoad-Methode aus anstoßen (wie Denniz schon korrekt angeführt hat).

Gruß
.
 
Ich glaube die FUnktionsweise des "onLoad" Events ist mir wohl nicht ganz klar.
Für mich sah das so aus: WENN geladen wird, dann verarbeite die eingehenden Daten wie folgt: blablabla. Wieso müssen die Daten auch direkt bei EIngang verarbeitet werden wenn der load - Prozess noch beim laden ist?

Kann man nciht alles einfach laden lassen, dann wenn dies der Fall ist, ein Array auslesen und eben in einzelne Arrays einladen (if(myXML_xml.loaded)...)?

Gibt es denn eine beschränkung, wenn ich Dateien einlade?
Ich meine, wenn wirklich meine Variante klappen sollte, also das erst geladen wird,
und die daten dann erst verarbeitet werden wenn der load Vorgang beendet ist (eigentlich ineffizienter, jedenfalls beim ersten laden), dann darf die zu ladende Datei doch eien bestimmte größte theoretisch nicht überschreiten, oder?

Was sagt ihr zu diesem Script (Quelle aus dem Buch Flash 8 und PHP):
Code:
var maxLadeversuche=3;

var myLoader=new XML();
myLoader.ignoreWhite= true;
myLoader.load("xml.xml");

myLoader.onLoad = function(){
anzLadeversuche++;

//Jetzt kommts...
if(myLoader.loaded){
var theData:Array=myLoader.firstChild.firstChild.firstChild.childNodes;

for(var i=0;i<theData.length; i++){
_root[theData[i].nodeName}=theData[i].firstChild.nodeValue;
}
gotoAndStop("Ladevorgang erfolgreich");
}
else{
if(anzLadeversuche<maxLadeversuche){
myLoader.load("xml.xml");
}
else{
gotoAndStop("Ladevorgang Fehlgeschlagen");
}
}
}
stop();

Die XML Struktur war hier anders.
Zwei Dinge interessieren mich aber:
Das Root-Array, und diese Bedingung "loaded".

Läuft das nicht exakt darauf hinaus, was ich meinte, also das die Gesamte XML Datei in einem Array gespeichert wird (bzw. die komplette Stelle: myLoader.firstChild.firstChild.firstChild.childNodes)?

Besten Gruß,

und danke Euch allen...
 
Hi,

leider verstehe ich Deine Aussagen nur zum Teil.

Die Dateigröße hat mit der Funktionsweise des Ladens nichts zu tun - im Gegenteil: Würden Daten nicht asynchron geladen werden, würde jedes Script so lange unterbrochen werden, bis die Datei komplett geladen ist. Probier mal:
Code:
var lv = new LoadVars();

lv.onLoad = function() {
  go();
}

function go() {
  trace("fertig geladen");
}

trace("ich beginne mit dem Laden:");

lv.load("sehrgrossedatei.txt");

trace("bin dabei, Daten zu laden ...");
und beachte, in welcher Reihenfolge die Daten ankommen, wenn Du über einen Server oder den Bandbreitenprofiler testest.

Die Besonderheit in dem von Dir geposteten Script ist hauptsächlich die Tatsache, dass versucht wird, die Datei mehrmals zu laden (idr. überflüssig, da onLoad erst aufgerufen wird, wenn die Daten angekommen sind).

Das Script legt zudem auf _root Variablen an, die nach den Namen der Knoten des XML-Baumes benannt sind - eine Vorgehensweise, die ich auch nicht unbedingt befürworten würde.

Gruß
.
 
Zurück