Avatar billede Slettet bruger
26. marts 2007 - 16:40 Der er 13 kommentarer og
1 løsning

Forkert scope i simpel funktion

Hej eksperter!

Jeg har kæmpet lidt med følgende funktion:


function LOAD(PATH:String):String {
    var LOADVARS:LoadVars = new LoadVars();
    var OUTPUT:String = new String();
    LOADVARS.onData = function(STRING:String) {
        OUTPUT = STRING;
    }
    LOADVARS.load(PATH);
    return OUTPUT;
}


Desværre lader det til, at
LOADVARS.onData = function(STRING:String) {
    OUTPUT = STRING;
}
opretter en ny variabel, OUTPUT, så OUTPUT oprettet ved
var OUTPUT:String = new String();
stadig er "".

Hvordan rettes dette?
Avatar billede maqhem Nybegynder
26. marts 2007 - 17:02 #1
Flash er ikke det kvarte af en tusinde del af et nanosekund om at hente data fra en server, og derfor vil OUTPUT være tom indtil dataen er loaded. Hvis du vil have et reelt resultat, så prop din return ind under onData-funktionen.
Avatar billede Slettet bruger
27. marts 2007 - 08:20 #2
Hm, for pokker da, regnede med, at Flash ville registrere onLoad og vente... Men hvad pokker. :)
Har du et forslag?
Avatar billede maqhem Nybegynder
27. marts 2007 - 11:01 #3
Jeg ville ikke lave det som en returnering af en værdi, men kalde en funktion fra onData-funktionen. Lidt som:

var PATH:String = new String("http://www.blabla.dk/noget.php");
var LOADVARS:LoadVars = new LoadVars();
LOADVARS.onData = function(STRING:String) {
    LOADED(LOADVARS);
}
LOADVARS.load(PATH);
function LOADED(VARS:Array):Void {
    // VARS er nu defineret som et nummerisk og assosiativt array
}
Avatar billede Slettet bruger
27. marts 2007 - 11:49 #4
Woot?
Hvorledes bliver VARS er Array, du definerer det jeg ikke...
Avatar billede maqhem Nybegynder
27. marts 2007 - 12:14 #5
Det er jo en parameter, der sendes med kaldet af funktionen LOADED. Denne er udfaldet af dit php-script.
Avatar billede mat Nybegynder
27. marts 2007 - 12:43 #6
LoadVars er vel ikke af typen Array, det er af typen LoadVars og Object (gennem arv)?

mvh mat
Avatar billede Slettet bruger
27. marts 2007 - 13:12 #7
Der skal heller ikk være nogen php-fil!
Den skal bare hente en String ud fra en tekstfil...
Avatar billede maqhem Nybegynder
27. marts 2007 - 13:21 #8
1. Jo, mat, du har ret. Men i dette tilfælde vil jeg betragte brugen af Object og brugen af et assosiativt array som det samme, men teknisk set har du ret. Min datatyping burde have været Object.
Avatar billede maqhem Nybegynder
27. marts 2007 - 13:21 #9
2. Okay. Men det virker på samme måde.
Avatar billede Slettet bruger
27. marts 2007 - 15:04 #10
Okaj, men kan du så ikke lige vise mig, hvordan du har tænkt dig at gøre det?
Avatar billede maqhem Nybegynder
27. marts 2007 - 17:38 #11
var file:String = new String("test.txt");
var loadObject:LoadVars = new LoadVars();
loadObject.load(file);
loadObject.onLoad = function(success) {
    if(success) {
        trace("Data fra filen " + file + ": ");
        for(var i:String in loadObject) {
            trace(i + ": " + loadObject[i]);
        }
    } else {
        trace("Filen " + file + " kunne ikke findes...");
    }
}
Avatar billede Slettet bruger
27. marts 2007 - 18:39 #12
Jeg integrerer koden i hovedscriptet i stedet. Bare smid et svar :)
Avatar billede maqhem Nybegynder
27. marts 2007 - 18:39 #13
Jep, svar
Avatar billede maqhem Nybegynder
27. marts 2007 - 18:40 #14
Det skal lige siges, at det faktisk var meget simplere, end jeg lige troede:

var loadObject:LoadVars = new LoadVars();
loadObject.load("test.txt");
loadObject.onLoad = function() {
    trace(loadObject);
}

Og jeg kom også med en anden udgave, hvis man nu skulle loade fra forskellige filer til forskellige funktioner, så kunne denne gøre sig smart:

LOAD("test.txt", goOn);
function goOn(string:Object):Void {
    trace(string);
}
function LOAD(path:String, nextFunction:Function):Void {
    var loadObject:LoadVars = new LoadVars();
    loadObject.load(path);
    loadObject.onLoad = function() {
        nextFunction.apply(null, [loadObject]);
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester