Entries

AS3で非同期処理を行う為のcommandsライブラリ

AS3で最もウザイ、複数の非同期処理の連続実行の為のライブラリ書いたよー。ネームスペース適当なのは評価版だから。

commandsライブラリリポジトリ

関数の実行をCommandクラスとして表現し、複数のCommandサブクラスを連続実行することにより、非同期通信の一元化を可能としたライブラリです。


■使い方

■Commandクラス

まず基本的なCommandクラスの使い方は、引数にthisスコープ、関数参照、引数配列の3つを私。executeのコールで実行。

var myCommand:Command = new Command( null, trace, ["テストテスト"]);
myCommand.execute();

といった感じで、登録した関数を実行します。またexecuteのタイミングで、Event.COMPLETEが呼ばれます。

■AsyncCommandクラス

非同期通信用のCommandサブクラスは、第4、第5引数に非同期イベントのディスパッチャと非同期イベントも登録します。

var asyncCommand:Command = new AsyncCommand( myLoader, myLoader.load, [new URLRequest("URL"), myLoader.loaderContent, Event.COMPLETE]);

asyncCommand.execute();

といった感じ。executeで登録した非同期関数の実行を行い、引数で渡したイベントを見張って非同期処理の終了とともにEvent.COMPLETEを発行します。

■SerialCommandクラス

複数のCommandをバインドして、順番に実行し、全て終了した時点でEvent.COMPLETEを発行します。

var ar:Array = []
ar.push( new Command(null, trace, ["start serial command"]) );
ar.push( new ASyncCommand(myLoader, myLoader.load, [new URLRequest("URL")], myLoader.loaderContent, Event.COMPLETE));
ar.push( new TimerCommand(1000));
ar.push( new XMLLoaderCommand({url:"hogehoge", dataScope:this, dataProp:"dataResult"}))

var command:SerialCommand = new SerialCommand( ar );
command.execute();

この処理では順番にトレース文を出し、非同期でLoaderでロードし、1000ミリ秒待ち、XMLをロードしてthis.dataResultに値を注入します。全てが終了した時点でEvent.COMPLETEが発行されます。

■ParallelCommandクラス

Serialと使い方は一緒ですが、全ての子コマンドを同時に実行し、全ての結果が返ってくるのを待ってからEvent.COMPLETEを発行します。

■TweenerCommand

executeで登録したTweenerのアニメーションを行い、アニメ終了後にEvent.COMPLETEが発行されます。

var command:Command = new TwenerCommand(this, {time:1, x:100})
command.execute()

ICommandインターフェースを実装し、関数executeと処理終了後にEvent.COMPLETEさえ発行すれば、どんなものでもコマンドのチェーンに埋め込めるので、かなり汎用的に非同期バッチ処理をかけます。非同期処理の一元化のたたき台程度にどうぞ。

最近、AS3使いの間でいっせいに非同期処理のライブラリが出てますね。やっぱりそれだけココは鬼門ってことなんでしょうか。

beinteractive Threadライブラリ
secondlife Chainライブラリ
voide elements Chainライブラリ

ちなみに他ライブラリと比べた場合の利点は、処理をクラスインスタンスとしてラップしているので、一連のバッチ処理を変数として保持したり、ボタンのコールバックに結びつけたりできることです。