« 非同期処理クラス ASDeferred を作ってみた | メイン | 召喚呪文メーカー作ったよ »

as3の非同期処理を行うお手軽ライブラリを作った

CommandだとかThreadだとかChainだとか、as3の非同期処理クラスを見ていて思うのはとにかく小回りがきかないこと。

実装はどれも素晴らしいんですが、ちょっとだけ使いたい時でもひたすら型を書かなきゃならなかったりと微妙に不便なので手軽に使える非同期処理クラスを作りました。
ASDeferred(JSDeferred) をベースにしています。


Chain ライブラリ


・・・激しく名前かぶってますorz
だって後から知ったんだもの。

コンセプトは以下の3つ。
・やってることが一目で分かる
・必要なコード量を極力減らす
・取得データを参照しやすい仕組み

■やってることが一目でわかる

これは Tweener を参考にしました。
パラメータをオブジェクトで渡すことで視認性大幅アップ、かつ各処理クラスを隠蔽します。
データをテキストで読みたい場合は text、バイナリで読みたいときは binary パラメータに読込先のアドレスを設定します。
また、CGIを叩きたい時は vars でパラメータを指定することもできます。



Chain.parallel({
foo: { time:2 },
bar: {
img:"sample.jpg",
delay:1
},
php: {
variables:"sample.php",
vars:{ handle:"hoge", id:"12345"},
method:"post"
}
}).
next( function():void {
trace("elapsed: " + this.data.foo );
trace("jpeg width: " + this.data.bar.content.width );

addChild( this.data.bar );
}).
load( { swf:hoge.swf, target:this } ).
log("chain end");

parallel の引数にある foo とか bar とかはただの添字なので重複しなければなんでもいいです。




■必要なコード量を極力減らす

インスタンス生成コードを毎回書いてるとうざくなるので、そういうのは諸々スタティックメソッドで吸収しています。
また、traceするだけなのにメソッド定義するのも相当うざいので log メソッドで。



// 1秒後にhoge出力
Chain.wait(1).log("hoge");


並列処理の定義ではわざわざ型宣言が必要なメソッドを書かなくてもいいようにしています。
onStart や onComplete には通常コールバックメソッドを設定しますが、文字列にすると自動的に trace するメソッドに置換するようにしています。
デバッグに便利。

// 指定ページのテキスト情報を取得し、かつ5秒以上が経過したら出力
Chain.parallel({
	foo: { time:5, onComplete:"5000ms" },
	bar: {
		text:"http://www.google.co.jp/", 
		onStart:"load text: start",
		onComplete:"load text: complete"
	}
}).
next( function():void {
	trace( this.data.bar );
});

その他、マウスイベントや Tweener にも対応(仮実装です)

// ムービークリップをクリックするとフェードアウト
Chain.listen( mc, MouseEvent.CLICK ).
tweener( mc, { alpha:0, time:1, transition:"linear"} );



■取得データを参照しやすい仕組み

取得したデータを参照する際、メソッドの引数にわざわざ取得データ配列を渡していると記述ミスによるランタイムエラーを誘発しやすいので、全部 this.data で参照できるようにしました。
並列処理の場合はオブジェクトとして、単独処理の場合は値としてそのまま参照できます。
また、直接繋がっているメソッドでしか参照できないのはどうにも不便なので getter を利用してチェインを遡って参照できるようにしています。
parallelやloopに引き継ぐ場合はスコープが複雑になるので、データを外部に逃がした方が賢明かもしれません・・・このあたり、もすこし研究してみたいと思います。

Chain.load( { swf:"hoge.swf", delay:1 } ).
log("hoge").
next( function():void {
	addChild( this.data );
});

その他エラーハンドリングまわりがまだ未調整なので、ランタイムエラーが発生する可能性があります。
特定のエラーが起きた時に紐付けされたチェインだけ解除するとか、拡張機能を考え始めるとキリがない・・・

トラックバック

このエントリーのトラックバックURL:
http://void.heteml.jp/mt/mt-tb.cgi/118

コメント

最近AS3.0を使い始め、URLLoaderを使うとき、めんどくさいと感じていたら、Chainライブラリを発見したので、使わせてもらってます。

あと、ミスだと思われる箇所があったので報告します。
URLLoaderChainの69行目の
param.onStart is Function

param.onComplete is Function
だと思います。
80行目も同じようなミスだと思います。

>syoheiさん
作りっぱなしで放置していたので恥ずかしい限りですが
LoaderChain含め、該当箇所を修正してコミットしておきました。
ご指摘ありがとうございました。

コメントを投稿

あわせて読みたい