3

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

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

我有一个使用 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 方法之后触发。

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

4

5 回答 5

1

我认为,有一个带有负载的“之后”事件。

所以你必须在两个不同的方法中拆分对 new() 的调用和对 do() 的调用,所以 new() 是在初始化中调用的,do() 是在 load() 之后调用的

伪语法:

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


afterLoad()
  enableDoSomething()


someMethod()
  doSomething()
于 2009-03-12T10:55:05.883 回答
1

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

似乎同步加载是不可能的。加载可能会失败或花费太长时间,我们不能因此而冻结应用程序。这是合理的,但我仍然觉得它会使代码变得比它应该的更复杂。

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

有更好的想法吗?

于 2009-03-12T12:24:57.947 回答
1

同步加载是不可能的,flash 是为 web 构建的,你永远无法确定调用需要多长时间。Air 是不同的,因为它从文件系统加载,并且那里的延迟量几乎没有。

最干净的解决方案是监听 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。没有办法解决这个问题。

于 2009-03-12T15:34:23.487 回答
1

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

创建一个您在处理 resultEvent 的函数内部分派的自定义事件

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

于 2010-10-19T03:34:35.280 回答
0

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

于 2009-03-12T11:05:54.483 回答