2011-06-25 8 views
2

私は、連続して実行する一連の関数を別の関数の代わりに実行したいと考えています。関数のシーケンスを線形に扱う(as3)

ここ

あなたはf1()を実行する場合は、内の関数をプッシュするメカニズムの

f1 start 
f2 start 
f3 start 
f3 end 
f2 end 
f1 end 

任意のアイデアを取得する必要がありますは、次の3つの機能

f1(){ 
    trace("f1 start") 
    f2(); 
    trace("f1 end") 
} 
f2(){ 
    trace("f2 start") 
    f3(); 
    trace("f2 end") 
} 
f3(){ 
    trace("f3 start") 
    trace("f3 end") 
} 

を考えてみましょう...私が何を意味するかです私が持つことができるようにするためには、次のようにする:

f1 start 
f1 end 
f2 start 
f2 end 
f3 start 
f3 end 

私は関数実行関数を使用する場合、どのようにイベントが終了したことを通知できますか?すべての関数は、関数が非同期で実行するためのイベントディスパッチャを持つ必要がありますか?

+0

に設定された時間でonCompleteのリスナーによって考慮されるタイマーイベントを、使用している4年後に正しいことをマーキングいただきありがとうございます! – Chris

答えて

3

イベントが同期を実行する場合は、ような単純なもの持つことができます。上記の

var fArray:Array = [f1, f2, f3]; 

fArray.forEach(function(item:Function, i:int, a:Array):void { 
    item(); 
}); 

を関数が同期している場合に動作します。実行命令は保証されているので。

一方、関数がの非同期である場合は、イベント、シグナル、またはコールバックのいずれかを使用する必要があります。

私はたぶんこのコールバックを使用します。以下の例を参照してください。 Functionクラスを拡張できないのは残念ですが、finalとしてマークされています。とにかく、この例では、fManagerは開始時に一度呼び出され、それを取得して残りを自動的に行います。関数が実行されるたびに、fManagerは自身を参照してfManagerを呼び出し、リストから削除することができます。私たちは「ので

var fArray:Array = [f1, f2, f3]; 

function fManager(_f:Function = null) { 
    // Remove the one that just finished 
    if(_f !== null) { 
     fArray.splice(_f, 1); 
    } 

    // Run the next one 
    if(fArray.length > 0) { 
     // sends in function manager 
     fArray[0](arguments.callee); 
    } 
} 

function f1(f:Function):void { 
    trace("f1"); 

    // Captures the current function 
    fManager(arguments.callee); 
    return; 
} 

function f2(f:Function):void { 
    trace("f1"); 

    // Captures the current function 
    fManager(arguments.callee); 
    return; 
} 

function f3(f:Function):void { 
    trace("f3"); 

    // Captures the current function 
    fManager(arguments.callee); 
    return; 
} 

// Start the code 
fManager(); 
0

ではなく、他の関数内で実行されている機能で、今それを周りに少し... を果たし、それは、唯一のexecute機能、その他の機能(F1、F2など)を完全に閉じ以内に起こります戻り関数を使用します。

このように関数を実行する利点は、関数が使用しているすべてのリソースを同じ関数で編集することができず、関数用に作成されたリソースの場合は、それらをゴミ次の関数が開始する前にコレクションを作成します。

public function startSequence():void { 
    execute(f1); 
} 

public function execute($f1:Function):void { 
    var $f2:Function = $f1(); 
    if ($f2 != null) { 
     execute($f2); 
    } 
} 

public function f1():Function { 
    trace("f1"); 
    return f2 
} 


public function f2():Function { 
    trace("f2"); 
    return null 
} 

これを行うための別の方法は、イベントの実行が0

関連する問題