2011-07-15 148 views
0

我讀過一些關於Actionscript中的異步等待的事情,但實際上無法真正實現。下面是我的代碼很短的,簡化的版本,我有一個類:Actionscript中的異步操作

private function getXML():void { 
    var xmlLoader:URLLoader = new URLLoader(); 
    xmlLoader.addEventListener(Event.COMPLETE, loadXML); 
    xmlLoader.load(new URLRequest("test.xml")); 
} 

private function loadXML(evt:Event):void { 
    var xmlData:XML = new XML(evt.target.data); 
    this.parseResults(xmlData); 
} 

private function parseResults(resultsInput:XML):void {  
    this.text = resultsInput.Node.attributes()[0]; 
} 

這是一個標準的GET XML,做火的時候一個動作,然後發佈第一屬性的類變量text一個節點。

我想調用這個函數是:

// assume doSomething("circle") was called 
private function doSomething(shape:String):String { 
    this.getXML(); 

    if (this.text == shape) { 
     // draw circle 
     return "Drew circle"; 
    } else { 
     return "Not a circle in the node"; 
    } 
} 

問題是,我總是得到Not a circle in the node因爲下面的getXML()的處理步驟的執行速度比事件快可以加載,火,然後存儲到類變量進行檢查。我已經閱讀了使用匿名函數等待或使用狀態或向函數添加事件監聽器的所有內容(可能嗎?),但我無法正確實現它們(或者不明白如何正確實現),所以有人可以給我一個我如何用上面的代碼來做這個例子?

事情我已經嘗試過,並沒有奏效:

聲明中的getXML(函數變量),這樣的功能將無法完成,直到XML閱讀

var f:Function = function loadXML(evt:Event):void {... etc. 
then calling f in getXML 

不工作中,我不知道如何調用函數變量在ActionScript中makethis工作

聲明狀態變量xmlLoaderState

in getXML() 
    if (this.xmlLoaderState == "waiting") { 
     this.xmlLoaderState = "busy"; 
    } 
in parseResults at the end 
    this.xmlLoaderState = "waiting" 
then in doSomething() 
    while (this.xmlLoaderState == "busy") {} 

這個無限循環,我猜這是因爲只有一個線程,所以循環也阻止xmlLoader。

回答

0

我通過使該函數中的所有參數都是類變量,然後使用這些類變量來檢查該形狀是否正確,從而「解決了」參數問題。這是對命名空間的非常糟糕的濫用,但我不知道如何去做。即使我增加了完整的事件,我也無法將參數傳入默認的URLLoader類,這意味着我不得不改變內置的URLLoader類來接受自定義參數,這對我看起來像是太感興趣了一個典型的問題。

希望有人過來告訴我一個更好的解決方案,我會一直關注它,直到現在這是一個臨時修復程序,可以讓代碼運行。

1

有人迴應你的問題,我不知道它在哪裏。

無論如何,由於調用是異步的,因此Flex將觸發加載事件,然後繼續卡車運行到下一行。你需要做的是等待Flex從服務調用接收響應,然後你可以引用xml。

這可以通過將「doSomething」代碼放入Event.COMPLETE處理程序中來實現。這樣你就知道數據已經被加載了。

+0

我看到了,因爲某些原因他刪除了它。我將如何處理傳遞給該函數的參數?我的第一個函數調用是doSomething函數,但是如果不寫一個自定義的COMPLETE事件我就不會傳遞這些參數。 – NorthGuard