Flex 3:同步加载xml文件

时间:2009-03-12 10:49:18

标签: xml flex synchronous

我的问题很简单:在flex3中,有没有办法同步加载xml文件?

我知道如何使用load事件异步加载。这可能是有用的,也可能不是。我只是想读取文件,解析它,做我必须做的事情,然后继续执行代码。

我有一个使用xml文件存储一些配置参数的组件。我需要在初始化对象时读取文件。但是,使用事件模型,我无法控制何时加载文件,因此我必须编写代码以“等待”加载代码。这太荒谬了,还是我呢?我想要这样的代码:

var foo:Foo = new Foo(); //This constructor should read the xml and initialize the object.
foo.doSomething(); //When I call this method the xml must be already handled.

我可以处理事件中的xml文件,它工作正常,但事件在之后触发 doSomething方法。

我希望我已经解释过了自己。我认为这应该很简单,但它让我发疯。除非真的有必要,否则我不想编写代码来等待事件。我觉得这一切应该只是一行代码!

5 个答案:

答案 0 :(得分:1)

我认为,有一个“后”事件加载。

因此你必须在两个不同的方法中将调用拆分为new()和调用do(),因此在initalisation中调用new()并在load()

pseudosyntax:

beforeInitialisation()
  disableDoSomething()
  new()...
  loader.addEvent(AFTERLOAD, afterLoad)


afterLoad()
  enableDoSomething()


someMethod()
  doSomething()

答案 1 :(得分:1)

我会回答自己,但是我仍然想知道是否有人提出了更好的想法。来自Dirkgently和Peter Miehle的答案都很有帮助,但并没有解决我的实际问题。

似乎无法进行同步加载。加载可能会失败或花费太长时间,因此我们无法冻结应用程序。这是合理的,但我仍然认为它可以使代码更复杂。

我要做的是在创建对象之前加载xml文件,并将其作为参数传递给构造函数。这样我就可以确保对象在需要时加载了xml文件。然而,这也不是一个理想的解决方案,因为现在我必须让另一个班负责Foo的“私事”。

有更好的想法吗?

答案 2 :(得分:1)

无法同步加载,为网络构建了闪存,您无法确定呼叫需要多长时间。空气是不同的,因为它从文件系统加载,并且那里没有相同数量的延迟。

最干净的解决方案是监听Foo内部的负载并从内部调用doSomething(),这样你的“外部”类就不需要费心了。

如果您确实需要从外部调用foo.doSomething(),则可以使用事件系统。让你的Foo类在加载时调度一个事件:

dispatchEvent(new Event(Event.COMPLETE, true));

要抓住你需要像这样听取它:

foo.addEventListener(Event.COMPLETE, handleFooComplete);

你的事件处理函数应该如下所示:

private function handleFooComplete(e:Event):void{
    foo.doSomething();
}

但是你选择这样做,你需要在加载器上监听Event.COMPLETE。没有解决这个问题。

答案 3 :(得分:1)

老问题,但我打赌很多人仍然来这里,这是我的解决方案。

创建一个自定义事件,您可以在处理resultEvent

的函数内部进行调度

让你想做某事的对象,我认为在这种情况下是foo,听这个自定义事件,然后调用doSomething()。

答案 4 :(得分:0)

从XML加载事件的事件处理程序内部调用foo.doSomething();(例如EVENT.Complete或某些,具体取决于您加载文件的具体程度)。这是推荐的方式。