FuncコマンドをParallelListで処理すると

2009.04.12  Category:ActionScript3.0

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コマンドいいですね。

RSS Reader
RSSリーダーへの登録をお願いします。
トップへ戻るボタン

著者

大庭俊介
株式会社サイバーエージェント所属の紙デザイナー上がりのFlashデベロッパー。アメーバピグ内のコンテンツ企画、実装を手掛けています。金沢美術工芸大学出身。
follow twitter

おすすめ

イニシエーション・ラブ/ 乾 くるみ

最後の2行目を見たときにマジでビビり、最初からまた読み返してしまい、ネタばれのサイトに行き着く。

フィジカルコンピューティングを「仕事」にする

初めての共著作。Kinect作品PiggFighterの項目を執筆しています。

基礎からのiOS SDK

iPhone開発ド素人の僕が現在、勉強中の本。結構丁寧に書かれてあって分かりやすい。特にWebブラウザ作成のチュートリアル部分の説明でかなり理解が深まった。