Toon posts:

[Flash] Script pauzeren, terwijl object laadt (xml,loadvars)

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben voor eigen gebruik bezig met het opzetten van een soort Flash framework. Hier zit onder andere een functie getXML() in, bedoeling is dus dat ik straks gemakkelijk xml kan inladen door iets als:
code:
1
var xmldata = getXML(xmlfile);

te doen.

De functie ziet er dus ongeveer als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function getXML(xmlfile) {
    var currentlevel = this;

    this.xml = new XML();
    this.xml.ignoreWhite;

    this.xml.onLoad = function(s) {
        if (s) { //success
            return this;
        } else { // failure
            _root.debug("Could not open xml file: " + xmlfile);
        }
    }
    this.xml.load(xmlfile);
}

Dit wil ik onder andere gaan uitbreiden naar LoadVars functionaliteit. Probleem is echter, dat tegen de tijd dat de xml geladen is, de functie al gepasseerd is. De functie geeft dus niets terug. Ik wil op de een of andere manier dit toch voor elkaar krijgen (meestal zit je toch te klooien met die onLoad handler, en dat hindert om meer OO te gaan werken, vind ik).

Do..while loop blijkt niet te werken, hij blijft daar in hangen. setInterval biedt hier ook geen uitkomst. Iemand toevallig suggesties?

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Begrijp ik nou goed dat je niet met onLoad wilt werken?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Verwijderd

Topicstarter
Ik denk dat ik daar inderdaad een omweg voor wil. Wat ik tot nu toe vaak heb gehad in zulke situaties, is dat je lappen code binnen die onLoad handler zet, soms genest, dat maakt het onoverzichtelijk.

Zo kwam ik op het idee om een laadfunctie te schrijven: getXML();
Zo voorkom je ook problemen dat je script uitgaat van XML die er wellicht op dat punt nog niet is, ook met LoadVars zit je met dit probleem.

Het beste zou dus zijn om het script te pauzeren binnen die getXML functie, en zodra de xml geladen is verder te laten gaan, zodat een "return xmlObj" gewoon werkt.

Ideaal gezien dus:

code:
1
2
3
4
5
6
function getXML(xmlfile) {
  this.xml = new XML();

  this.xml.load(xmlfile);
  return this.xml;
}


Is dit een beetje duidelijker?

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Ik kan eigenlijk niet echt Actionscript, maar da's toch gewoon ECMAScript? Dan kun je zoiets doen (ook niet ergens anders in getest ofzo):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function getXML(xmlfile) {
    var currentlevel = this;
    var loaded  = false;
    
    this.xml = new XML(); 
    this.xml.ignoreWhite;
    this.xml.loader = this;
    this.xml.onLoad = function(s) {
        if (s) { //success
            this.loader.loaded = true;
        } else { // failure
            _root.debug("Could not open xml file: " + xmlfile);
        }
    }
    
    while(!this.loaded) {
        // pauze...
    };
    return this.xml;
}


Maar ben overigens niet echt een voorstander van pauzes in event-driven apps...

  • ocdaan
  • Registratie: Augustus 2001
  • Laatst online: 16-04 13:27

ocdaan

Niet zo zeuren jongens!

Dit is een stuk code die ik gebruik, werkt als een trein ;) en aljeblieft, gebruik de onLoad handler icm het delegate object >> werkt perfect. Pas als we naar as3 gaan is dit verleden tijd. Maar voor nu is de delegate echt onmisbaar :)

Dit is trouwens een stuk code uit m'n XMLoader class. :) Wanneer de onLoad handler aangeroepen word kan je vanuit daar weer de draad oppakken.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function xmlLoader (connString : String){
    EventDispatcher.initialize(this);
    
    vidXML = new XML ();
    vidXML.ignoreWhite = true;
    vidXML.load (connString);
    
    vidXML.onLoad = Delegate.create (this, onLoadHandler);}
    public function onLoadHandler (success:Boolean){
        if (success){
            xmlArray = new Array ()
            var currentNode:XMLNode = vidXML.firstChild.firstChild;
            //enz enz enz hier vul ik iig de een array met de xml info

            errStatus = 0;
            boLoaded = true;
        }else{
            errStatus = 1;
        }
        pushStatus(errStatus);
        
};

Verwijderd

Topicstarter
While had ik ook bedacht idd, helaas blijft xml.loaded onveranderd binnen die loop, en krijg je dus een infinite loop.

Verwijderd

Topicstarter
ocDaan schreef op dinsdag 06 december 2005 @ 13:11:
Dit is een stuk code die ik gebruik, werkt als een trein ;) en aljeblieft, gebruik de onLoad handler icm het delegate object >> werkt perfect. Pas als we naar as3 gaan is dit verleden tijd. Maar voor nu is de delegate echt onmisbaar :)

Dit is trouwens een stuk code uit m'n XMLoader class. :) Wanneer de onLoad handler aangeroepen word kan je vanuit daar weer de draad oppakken.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function xmlLoader (connString : String){
    EventDispatcher.initialize(this);
    
    vidXML = new XML ();
    vidXML.ignoreWhite = true;
    vidXML.load (connString);
    
    vidXML.onLoad = Delegate.create (this, onLoadHandler);}
    public function onLoadHandler (success:Boolean){
        if (success){
            xmlArray = new Array ()
            var currentNode:XMLNode = vidXML.firstChild.firstChild;
            //enz enz enz hier vul ik iig de een array met de xml info

            errStatus = 0;
            boLoaded = true;
        }else{
            errStatus = 1;
        }
        pushStatus(errStatus);
        
};
hmm, nu ken ik die delegate class niet (heb het opgezocht, en ik kan hem ook niet gebruiken > MX), maar in feite is toch hetzelfde als wat je normaal doet?

  • ocdaan
  • Registratie: Augustus 2001
  • Laatst online: 16-04 13:27

ocdaan

Niet zo zeuren jongens!

jajaja, je kan gewoon gebruiken. Let op de accolades, die staan nogal raar, in de eerste regel word die extra gezet en dan word de handler functie niet met een accolade afgesloten. kijk maar eens goed.

Mijn excuus, ik was onvolledig, om van deligate gebruik te maken moet je de class wel ff importeren, zet dit boven je script:

import mx.utils.Delegate;

//edit, ik heb dit pas ook moeten uitzoeken en met een beetje hulp van m'n m maatjes op flashfocus lukte het wel :P lees deze thread anders ook ff door ;)

[ Voor 26% gewijzigd door ocdaan op 06-12-2005 13:32 ]


  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 22-04 11:34
Verwijderd schreef op dinsdag 06 december 2005 @ 13:19:
[...]


hmm, nu ken ik die delegate class niet (heb het opgezocht, en ik kan hem ook niet gebruiken > MX), maar in feite is toch hetzelfde als wat je normaal doet?
Nee, met de Delegate class delegeer je de onload functie naar een functie (of functie van een class). De scope (het this object) is dan niet meer het XML object maar het object waarin de functie zich bevindt.

Verwijderd

Topicstarter
Ok allemaal gelezen, en ik vat dat nu redelijk :) maar dat is enkel bedoeld voor de scope, ik zit meer met een tijdsprobleem.

De functie getXML() geeft op deze manier toch nog steeds niets terug, of wel? Zoals ik het zie, is de functie al doorlopen nog voordat de callback heeft plaatsgevonden.


edit: bovendien kan ik dat hier niet gebruiken, aangezien het beschikbaar is sinds mx 2004, en ik MX heb.

[ Voor 17% gewijzigd door Verwijderd op 06-12-2005 14:11 ]


  • ocdaan
  • Registratie: Augustus 2001
  • Laatst online: 16-04 13:27

ocdaan

Niet zo zeuren jongens!

getURL ?? ik dacht dat je XML wilde inlezen?

Het is event driven he.... op het moment dat er data binnen komt of op het moment dat er een error melding komt vang je dit af met de onloadhandler. Ik laat ook altijd een interval meelopen voor het geval dat de onloadhandler niet binnen afzienbare tijd met een melding komt....

[ Voor 77% gewijzigd door ocdaan op 06-12-2005 14:12 ]


Verwijderd

Topicstarter
getXML() sorry! Force of habit ;)

[ Voor 4% gewijzigd door Verwijderd op 06-12-2005 14:11 ]

Pagina: 1