ActionScript中的程序流和事件监听器

时间:2012-06-01 12:18:22

标签: actionscript-3 events air event-handling

当XML从外部源加载时,我在程序流控制方面遇到困难。我正在使用Flash Builder 4.6

应该发生什么:使用装载机。在加载时监听。当它触发COMPLETE事件时,继续。 发生了什么:使用装载机。在加载时监听。但是在COMPLETE事件触发之前,程序控制将返回到调用类。同时,程序继续运行并抛出错误,因为它试图访问空的数据。

涉及三个班级:

  • AdvocacyWiz.mxml - 此AIR移动应用的基本MXML文件
  • Model.as - 模型类
  • myXMLLoader.as - 加载程序加载数据的类,然后 完成时调度事件。

一旦将AdvocacyWiz.mxml添加到舞台中,我就会在AdvocacyWiz.mxml中调用函数setUpModel()。该类中的setUpModel函数如下所示:

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

initialize函数调用在我的XMLLoader.as类中调用一个加载器。这就是事件监听器正在监听Complete事件的地方,这种情况发生得太晚以至于无法防止发生空错误。

编辑:这是代码 -

在AdvocacyWiz.mxml中(首先触发):

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

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

在模型中(这引发了第二次):

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");
    }

在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));
    }

我想要做的是调用setUpModel(),但是在模型实际拥有数据之前,没有流返回到mxml类。

感谢。

1 个答案:

答案 0 :(得分:1)

嗯,你没有提供任何代码,这会有很大帮助,但这里有一些指示。

  

应该发生什么:使用装载机。在加载时监听。什么时候   它会触发COMPLETE事件,继续。发生了什么:使用装载机。   在加载时监听。但在COMPLETE事件发生之前,   程序控制返回调用类。所以同时,   程序继续运行并抛出错误,因为它正在尝试访问   数据为空。

很多Flex都是异步。这意味着当您尝试从外部源加载时,程序控制会立即返回,如您所述。

为了获得您想要的程序流程,您需要在调用之后调用load()结束的函数。然后,当COMPLETE事件侦听器触发时,您可以执行导致null异常的其余代码。