[英]Flex 3: synchronously loading an xml file
我的問題非常簡單:在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方法之后觸發。
我希望我已經解釋過了自己。 我認為這應該很簡單,但它讓我發瘋。 除非真的有必要,否則我不想編寫代碼來等待事件。 我覺得這一切應該只是一行代碼!
老問題,但我打賭很多人仍然來這里,這是我的解決方案。
創建一個自定義事件,您可以在處理resultEvent的函數內部進行調度
讓你想要做的事情,我認為在這種情況下它是foo,聽這個自定義事件,然后調用doSomething()。
我認為,有一個“后”事件加載。
所以你必須在兩個不同的方法中將調用拆分為new()和調用do(),因此在initalisation中調用new(),在load()之后do()是calld
pseudosyntax:
beforeInitialisation()
disableDoSomething()
new()...
loader.addEvent(AFTERLOAD, afterLoad)
afterLoad()
enableDoSomething()
someMethod()
doSomething()
我會回答自己,但我仍然想知道是否有人想出更好的想法。 來自Dirkgently和Peter Miehle的答案都很有幫助,但並沒有解決我的實際問題。
似乎同步加載是不可能的。 加載可能會失敗或花費太長時間,因此我們無法凍結應用程序。 這是合理的,但我仍然認為它可以使代碼更復雜。
我要做的是在創建對象之前加載xml文件,並將其作為參數傳遞給構造函數。 這樣我就可以確保對象在需要時加載了xml文件。 然而,這也不是一個理想的解決方案,因為現在我必須讓另一個班負責Foo的“私事”。
有更好的想法嗎?
無法同步加載,為網絡構建閃存,您無法確定呼叫需要多長時間。 空氣是不同的,因為它從文件系統加載,並且那里沒有相同數量的延遲。
最干凈的解決方案是監聽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。 沒有解決這個問題。
調用foo.doSomething();
從XML加載事件的事件處理程序內部(例如EVENT.Complete
或某些,具體取決於您加載文件的確切程度)。 這是推薦的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.