variablenwerte ausserhalb onLoad

kalleplom

Mitglied
Warum zeigt mir trace immer undefined?
Ich habe schon alle möglichen Variationen der Deklaration auch mit global versucht, es will nicht.

Und wie kommt success zu seinem Wert? Liest man hier von links nach rechts bei der Zuweisung?


Code:
 var mp3, titel, bps;
function str_decoder(string) {
        enc_string = new LoadVars();
        enc_string.str = string;
        enc_string.onLoad = function(success) {
                if (success) {
                        
                        datas = new Array();
                        datas = this.flashvar.split("#");
                        mp3 = datas[0];
                        titel = datas[1];
                        bps = datas[2];
                        
                }
        };
        enc_string.sendAndLoad('http://localhost/test/decoder.php', enc_string, "POST");
}
str_decoder(c);
trace(mp3);

Ich weiss, dass innerhalb von onLoad trace die richtigen Datenausgibt, aber wie mache ich das ausserhalb der Funktion. Wie soll ich denn dort einen return Wert auswerten?
 
Hi,

LoadVars.onLoad arbeitet asynchron, das heisst, dass die Daten erst im onLoad-Handler existieren (klar: Herunterladen geht auch in der Regel nicht in Nullkommanichts). Auch wenn str_decoder sofort ausgeführt (und wieder beendet) wird, dauert es also einige Zeit, bis onLoad aufgerufen wird.

Deine trace-Aktion wird allerdings sofort ausgeführt, da sie ja direkt in der Zeitleiste steht.

Wenn Du nach dem Laden mit den erhaltenen Daten weiterarbeiten willst, kannst Du z.B. in der onLoad-Funktion eine weitere Funktion aufrufen, die diese Daten verwendet.

Gruß
.
 
..und kann dann trotzdem nur innerhalb von onLoad arbeiten?
ich brauch die Werte aber auch ausserhalb von onLoad. Ich habe noch viele andere Funktionen im Skript stehen. Denen kann ich die Werte nicht übergeben? :confused:
 
Dir ist schon klar, das sendAndLoad vor onLoad ausgeführt wird, oder ?
Das der Trace ausserhalb onLoad undefined ergiebt, ist dann auch klar, eben weil noch kein Wert da ist.
Das Problem ist so alt wie das laden externer Daten in Flash und anderswo.
Die Lösung ist einfach, du kannst zB alle nachfolgenden Operationen in eigene Funktionen ausgliedern, die du onLoad aufrufst, oder du machst an den Schluss des onLoad Blocks ein _root.gotoAndPlay(x), und fährst auf dem nächsten Frame ganz normal und ohne Funktionen im Code fort - wenn das deine Filmstruktur zulässt.

Grüsse
B
 
Basileus hat gesagt.:
Klar, du kannst die andern Funktionen mit Übergabeparametern aus dem onLoad Block heraus aufrufen.

-.-.
Also muss alles innerhalb von onLoad stehen...?
Soso... komisch trotzdem.

Ich tausch jedenfalls schon mal die Reihenfolge.
 
Also muss alles innerhalb von onLoad stehen...?
Nicht unbedingt - Du kannst wie gesagt alles andere von dort aus aufrufen. Allerdings: Alles was sonst auf diese Variablen zugreift, darf erst nach dem onLoad ausgeführt werden (Du bist wahrscheinlich davon ausgegangen, dass Flash mit der Ausführung des Codes so lange wartet, bis die Daten geladen sind; das ist aber nicht der Fall. Stell Dir mal vor, was passiert, wenn die Datei nicht gefunden wird - das Script hängt sich auf? ;) ).

Von daher gilt die Devise: Nachfolgende Funktionen aus onLoad heraus aufrufen! :)

Gruß
.
 
Ist das wirklich so umständlich in AS?
Ich kann also auch keine global definierten Variablen verwenden?
Und die Werte landen nicht im Stack, so dass ich auch wieder drauf zugreifen kann?
komisch...
 
Ist das wirklich so umständlich in AS?
Würd ich nicht sagen; welche Objekt- und Ereignisorientierte Sprache verhält sich da anders?

Ich kann also auch keine global definierten Variablen verwenden?
Doch, selbstverständlich:
PHP:
_global.bla = "sonstwas"; // globale Variable
var blubb = "wasauchimmer"; // Objektvariable
function foo() {
    var bar = 2; // lokale Variable
}

Und die Werte landen nicht im Stack, so dass ich auch wieder drauf zugreifen kann?
Gibbet bei AS nicht (ist ja eigentlich eine Scriptsprache) - es sei Denn, Du schreibst Dir selbst was ähnliches. Allerdings kannst Du durchaus die geladenen Werte an globale Variablen übergeben - das ändert aber nichts daran, dass die Werte erst gesetzt werden, wenn die Daten geladen sind. Wenn Du nicht ereignisorientiert arbeiten willst: Basileus hat doch schon eine einfache Alternative genannt: springe aus der onLoad-Funktion per gotoAndStop in einen anderen Frame - dort kannst Du dann wie gehabt direkt auf Deine Variablen zugreifen. ;)

und onLoad funktioniert dann wie 'ne main() in C?
Kann man eigentlich nicht wirklich vergleichen - main() definiert den Einstiegspunkt in die Anwendung, AS-Code wird generell schon linear abgearbeitet (wenn, dann kann man eher jeden Frame der Zeitleiste als eigene main-Methode betrachten). onLoad ist prinzipiell ein Listener.

Ok, meine Erklärungen sind hier etwas ungenau. Ich empfehle Dir, mal in ein AS (bzw. AS 2.0) Grundlagenbuch reinzuschauen.

Gruß
.
 
Zurück