FuncコマンドをParallelListで処理すると
2009.04.12
Progressionに実装されているコマンドクラスの代表的なコマンド、Funcコマンドの自分用の確認メモを書いておこうと思います。 Funcコマンドは、通常このように記述して実装します。
new Func(
func:Function,
args:Array = null,
dispatcher:IEventDispatcher = null,
eventType:String = null,
initObject:Object = null
).execute();
もしくは、addCommand内や、SerialList、ParallelList内に以下のように記述するのではないかと思います。
new SerialList(null,
function():void
{
//処理内容
}
).execute();
僕は、Progressionのコマンドの中で一番好きなのは、Funcコマンドです。非同期処理も簡潔なコードで書けるし、見通しが良いのがすばらしいです。
今までdispatcherを利用して処理待ちさせるような使い方をしていたFuncコマンドをParallelListで使ったことがなかったので、メモ。
func1 func2 func3 - func3_1 - func3_2func1~3までの関数があって、func3のみ入れ子で func3_1, func3_2がある状態です。 func1とfunc2は、ParallelListで同時実行します。どちらの処理も完了したら、func3を実行するというコマンドです。 func1~3はそれぞれ処理を開始するとWaitコマンドが実行され、func1~3にそれぞれ設定している時間を待ってから処理が完了します。 処理待ち時間は以下のようになっています。
func1 ---- 3000 func2 ---- 200 func3 ---- 2000 - func3_1 ---- 3000 - func3_2 ---- 1000僕の実行処理の想像はこんな感じです。
func1実行 func2実行 func2実行完了 func1実行完了 func3実行 - func3_1実行 - func3_2実行 - func3_2実行完了 func3実行完了 - func3_1実行完了 ------------------ 処理終了結果はどうなるか?
[処理の内容]
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.trace.Trace;
import jp.progression.commands.Func;
import jp.progression.commands.SerialList;
import jp.progression.commands.Wait;
/**
* ...
* @author Shunsuke Ohba
*/
public class FuncTest extends Sprite
{
public function FuncTest()
{
var scope:FuncTest = this;
new SerialList(null,
[
new Func(doFunc1,null,scope,"func1Complete"),
new Func(doFunc2,null,scope,"func2Complete")
],
new SerialList(null,
[
new Func(doFunc3, null, scope, "func3Complete"),
new SerialList(null,
[
new Func(doFunc3_1,null,scope,"func3_1Complete"),
new Func(doFunc3_2,null,scope,"func3_2Complete")
])
]
),
function():void
{
trace("------------------\n処理終了")
}
).execute();
}
//func1~3の処理関数
private function doFunc1():void
{
new SerialList(null,
new Func(trace,["func1実行"]),
new Wait(3000),
function():void
{
trace("func1実行完了");
dispatchEvent(new Event("func1Complete"));
}
).execute();
}
private function doFunc2():void
{
new SerialList(null,
new Func(trace,["func2実行"]),
new Wait(200),
function():void
{
trace("func2実行完了");
dispatchEvent(new Event("func2Complete"));
}
).execute();
}
private function doFunc3():void
{
new SerialList(null,
new Func(trace,["func3実行"]),
new Wait(2000),
function():void
{
trace("func3実行完了");
dispatchEvent(new Event("func3Complete"));
}
).execute();
}
private function doFunc3_1():void
{
new SerialList(null,
new Func(trace,[" - func3_1実行"]),
new Wait(3000),
function():void
{
trace(" - func3_1実行完了");
dispatchEvent(new Event("func3_1Complete"));
}
).execute();
}
private function doFunc3_2():void
{
new SerialList(null,
new Func(trace,[" - func3_2実行"]),
new Wait(1000),
function():void
{
trace(" - func3_2実行完了");
dispatchEvent(new Event("func3_2Complete"));
}
).execute();
}
}
}
[出力結果]
func1実行 func2実行 func2実行完了 func1実行完了 func3実行 - func3_1実行 - func3_2実行 - func3_2実行完了 func3実行完了 - func3_1実行完了 ------------------ 処理終了想像通りの結果でした。 オチはありません。
やはりFuncコマンドいいですね。
update 2010.01.02...
[関連記事]






