2011-08-11 16 views
0

OK、私が知っているところから、Flexのactionscriptは非同期で実行されます。私は、ループ内でメソッドを同期して実行する能力が必要です。このコードを考えてみましょう: Flex/Actionscriptのメソッド/関数のメソッド呼び出しを呼び出すときの最良の方法

public class CustomerContainer extends VBox 
{ 

    public function CustomerContainer() 
    { 
     super(); 
     addEventListener(FlexEvent.CREATION_COMPLETE, 
         this_creationCompleteHandler); 

    } 

    public function build():void 
    { 
        //process something here 

    } 
} 

は、今、私たちは私たちのMXMLファイル

<mx:Script> 
<![CDATA[ 

    private var newContainer:CustomerContainer; 

    public function foo():void 
    { 
     for (var i:int = 0; i < EndingNumber; i++) 
     { 

     newContainer = new CustomerContainer(); 
     newContainer.build();//I need this to finish before it goes on to the 
     // next one. here is where the problem is flex runs through this loop 
     // creating each new object but I do not know if the first 1 object is 
     // complete before it begin processing the second one in the For Loop. 
     } 
    } 
    ]]> 
</mx:Script> 

でループを持っている、それはもう少し複雑ここで説明することであるとして、これは私の正確な状況ではありません。抽象クラスとそこから派生したいくつかのカスタムビューオブジェクトがあります。いくつかのビューは最初に完了した他のものに依存していますが、正しい順序でそれらを並べることはできません。タイマーはオプションではありません。これを正しく説明していない可能性があります。

+2

あなたが望むように、それは正確に同期的に実行する必要があります。あなたが見ている結果は確かですか?ビルドメソッド内で非同期リモート呼び出しを使用するなど、何か他のことが起こっているはずです。完全に実行可能なサンプルを提供できますか?あなたの「ビルド」コードを知らなくても、「完成した」ということを推測するのは難しいです。あなたが何を指しているのかを知りません。 – JeffryHouser

+0

Flextrasに同意し、ここで問題は見られません。実際に問題が発生していますか?あなたの質問が語られる方法は、存在しないかもしれない問題を予期しているように聞こえます。 – NoobsArePeople2

+0

Actionscriptが非同期で実行されていません。それが事実なら、それは非常に面白いだろうコーディング。多分あなたのコードが非同期メソッド(サービスコール)を呼び出していますか? –

答えて

0

CairngormのTaskライブラリをご覧ください。

作業単位を注文し、それらを順次、並列、またはその両方で実行させる方法を提供します。

それ以外の場合は、イベントリスナーを処理したり、エラー状態が発生したりします。

+0

さらに、[Spicelibのタスクフレームワーク](http://www.spicefactory.org/parsley/docs/2.4/manual/);) –

0

私はこのLispの-yの方法を解決するのが好き:

// tell this function to start creating. 
private function initContainers(count:int):void 
{ 
    if(count <= 0) return; 
    var newContainer:CustomerContainer = new CustomerContainer(); 
    newContainer.build(); 
    /* ... stuff happens ... */ 
    newContainer.addEventListener(FlexEvent.CREATION_COMPLETE, 
            function(fe:FlexEvent):void 
            { 
             // tell the function to create one fewer 
             initContainers(count - 1); 
            }); 
} 

あなたの順序:

  1. initContainers(X) - >
    1. コンテナを作成します。
    2. イベントを待つ - >
  2. initContainers(X - 1)。
    1. コンテナを作成します。
    2. イベント待ち - あなたが示されたコードを考える><!-- lots o' more -->
関連する問題