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