我的问题很简单:在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方法。
我希望我已经解释过了自己。我认为这应该很简单,但它让我发疯。除非真的有必要,否则我不想编写代码来等待事件。我觉得这一切应该只是一行代码!
答案 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
或某些,具体取决于您加载文件的具体程度)。这是推荐的方式。