1

当从外部源加载 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

初始化函数调用调用我的 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");
    }

在加载器类中:

    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 类。

谢谢。

4

1 回答 1

1

好吧,您还没有提供任何代码,这将有很大帮助,但这里有一些指示。

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

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

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

于 2012-06-01T12:27:57.343 回答