FuncコマンドをParallelListで処理すると
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_2
func1~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 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コマンドいいですね。















