Flux de programe și ascultători de evenimente în ActionScript

M-am confruntat cu dificultăți în controlul fluxului de programe atunci când se încarcă xml dintr-o sursă externă. Folosesc Flash Builder 4.6

Ce ar trebui să se întâmple: utilizați un încărcător. Ascultați când este încărcat. Când declanșează evenimentul COMPLETE, continuați. Ce se întâmplă: utilizați un încărcător. Ascultați când este încărcat. Dar înainte de declanșarea evenimentului COMPLET, controlul programului revine la clasa apelantă. Între timp, programul continuă să meargă și aruncă o eroare deoarece încearcă să acceseze date care sunt nulă.

Sunt implicate trei clase:

  • AdvocacyWiz.mxml - fișierul MXML de bază pentru această aplicație mobilă AIR
  • Model.as - clasa modelului
  • myXMLLoader.as - clasa în care încărcătorul încarcă date, apoi expedia eveniment când este terminat.

Apelez la o funcție setUpModel() în AdvocacyWiz.mxml odată ce AdvocacyWiz.mxml este adăugat la etapă. Funcția setUpModel din clasa respectivă arată doar astfel:

Model.Instance.initialize(); //model is a singleton

Apelul de inițializare a funcției invocă un încărcător din clasa mea XMLLoader.as. Acolo unde ascultătorul evenimentului este lăsat să asculte evenimentul Complet, care se întâmplă prea târziu pentru a preveni apariția unei erori nul.

EDIT: Iată codul -

În AdvocacyWiz.mxml (aceasta se întâmplă mai întâi):

protected function addedToStageHandler(event:Event):void
{
   setUpModel();
   stage.scaleMode = StageScaleMode.NO_SCALE;
   //... additional layout functions

private function setUpModel():void {    
   Model.Instance.initialize();
}

În model (această incendii secundă):

public function initialize():void {
    addEventListeners(); //this includes listener for StoriesXMLLoader.STORY_LOADED event which will be dispatched from the loader class.
    useExternalXML();   
    ...
    }

    private function useExternalXML():void
    {
        myLoader.getStory("1140");
    }

În clasa Loader:

    public function getStory(storyId:String):void {
        var url:String = "http://mysite.com/whatever.xml";
        myLoader.dataFormat = URLLoaderDataFormat.TEXT;
        myLoader.addEventListener(Event.COMPLETE, storyXMLLoaded);
        myLoader.load(new URLRequest(url)); 
    }

    private function storyXMLLoaded(e:Event):void {
        storyXML = new XML(e.target.data);
        dispatchEvent(new Event(StoriesXMLLoader.STORY_LOADED));
    }

Ceea ce vreau să fac este să sun apel la setUpModel() dar să nu fiu returnat în clasa mxml până când modelul are de fapt date.

Mulțumiri.

1
Trebuie să reproiectați fluxul aplicației. Se bazează pe faptul că datele de la încărcător nu pot fi întotdeauna disponibile. Luați în considerare faptul că, în cazul în care sarcina nu a putut să recupereze deloc datele. În acest caz, doriți să afișați o eroare. Efectuarea erorilor ar trebui să fie întotdeauna rezolvată. Cu puțin mai mult efort puteți obține mult mai mult.
adăugat autor The_asMan, sursa

1 răspunsuri

Ei bine, nu ați furnizat niciun cod, care ar ajuta considerabil, dar aici sunt câteva indicații.

Ce ar trebui să se întâmple: utilizați un încărcător. Ascultați când este încărcat. Cand   declanșează evenimentul COMPLETE, continuați. Ce se întâmplă: utilizați un încărcător.   Ascultați când este încărcat. Dar, înainte de incendiul evenimentului COMPLET,    Controlul programului revine la clasa de apeluri . Între timp,   programul continuă să meargă și aruncă o eroare deoarece încearcă să acceseze   date care este null.

O mulțime de Flex este asincronă . Ce inseamna asta este ca atunci cand incerci sa incarci sursa externa, controlul programului revine imediat, dupa cum ai observat.

Pentru a avea tipul de flux de programe pe care îl doriți, trebuie să aveți funcția care solicită load() sfârșitul după acel apel. Apoi, când se declanșează ascultătorul evenimentului COMPLET, puteți executa restul codului care provoacă excepția nulă.

1
adăugat
S-ar putea să fie sincron, dar nu puteți conta pe ordinea în care se întâmplă.
adăugat autor Amy Blankenship, sursa
Codul a fost adăugat. Dat fiind faptul că apelul încărcătorului încărcat se află într-o funcție care provine dintr-o altă clasă, cum se poate preveni debitul să se întoarcă acolo? Apelând Loader.load în fișierul mxml?
adăugat autor David, sursa
Nu toate din flex este asincron, dar Loader este. Cea mai mare parte a acțiunilor și flexurilor este una simplă și sincronă.
adăugat autor James Holmes, sursa
@ 32bitkid Bună clarificare. Un mic creier mort în această dimineață.
adăugat autor Sam DeHaan, sursa