2011-07-15 37 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]; 
} 

イベントを発生し、その後text変数クラスのノードへの最初の属性を投稿して行わときには、標準のget XMLです:ここで私はクラスを持っている私のコードの短い、簡略化されたバージョンです。

私はこれを呼び出したい関数です。問題は、getXMLを以下の処理ステップは、()イベントは、火をロードし、その後に保存することができますより速く実行されるため、私はいつもNot a circle in the nodeを取得している

// 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"; 
    } 
} 

チェックされるべきクラス変数。私は、匿名関数の使用から状態の使用や状態へのリスナーの追加など、すべてを読みましたが、正しく実装することはできません(または正しく実装する方法を理解できませんでした)。どのように私は上記のコードでこれを行うのだろうか?

私が試したし、働いていないもの:

はgetXMLを関数の変数を宣言()ので、XMLは

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

を読み取られるまで機能が実行されることはありませんがありません仕事、私は状態変数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") {} 
に宣言makethis仕事

にActionScriptでの関数の変数を呼び出すするかどうかはわかりません0

この無限ループは、ループがxmlLoaderをブロックするようにスレッドが1つしかないので、私はそれを推測しています。

答えて

0

引数の問題を解決するには、その関数のすべての引数をクラス変数にしてから、そのクラス変数を使用して形状が正しいかどうかをチェックします。これは名前空間の悪い悪用ですが、それ以外の方法はわかりません。完全なイベントを増やしたとしても、デフォルトのURLLoaderクラスに引数を渡すことはできません。つまり、組み込みのURLLoaderクラスをカスタム引数に変更しなければならないということです。典型的な問題。

うまくいけば、誰かがやって来てより良い解決策を教えてくれることを願っています。これまではこれを実行してコードを実行する一時修正です。

1

あなたの質問に完全に答えた他の人がここに回答しましたが、どこに行ったのかわかりません。

とにかく、呼び出しは非同期であるため、Flexはロードイベントを発生させ、トラックを次の行に継続します。あなたがしなければならないことは、Flexがサービスコールからの応答を受け取るのを待ってからxmlを参照できるようにすることです。

これは、 "doSomething"コードをEvent.COMPLETEハンドラの中に入れることで実現できます。そうすれば、データがロードされたことがわかります。

+0

私はそれを見ました。彼は何らかの理由でそれを削除しました。しかし、その関数に渡された引数をどうすれば処理できますか?私の最初の関数呼び出しはdoSomething関数ですが、私が信じるカスタムCOMPLETEイベントを書かずにそれらの引数を渡す方法はありません。 – NorthGuard

関連する問題