やっぱり、ActionScriptの非同期処理はいろいろと面倒で、なんかいい方法はないかなーといろいろと考えているが、
なんかのサブクラスを作って、それで処理をするってのはどうもお手軽ではない。。。
(これはこれで本格的にやらなくてはいけないときにはいいのですが、やっぱりちょっとしたことをするのにサブクラスは気がひけますから・・・)

それで、
1)Bの処理はAが終わったら処理をする。
2)Cの処理はAが終わったら処理をする。
ここまでは、とくに非同期処理があっても面倒ではないのです。
ところが、
3)Dの処理はBとCの処理が終わったら処理をする。
ってのがあると、、、、んんん・・・・って考えてしまいます。

そこで、こんなことができるようにとクラスを作成してみました。
ポリシーは、
・書き方が簡単であること
・サブクラスなど複雑な構造にならないこと
ってな感じで、

書き方はこんな感じです。
[AS]
var flow:JobFlow = new JobFlow();
foo.addEventListener(eventName,execA);

// 処理Bは処理Aが終わってから・・・
// 第1引数が、処理したいFunction, 第2以降は依存
flow.addDependsListener(execB,execA);
flow.addDependsListener(execC,execA);
flow.addDependsListener(execD,execB,execC);

// この関数がexecAを呼び出すと仮定している・・
foo.execute();

private function execA(e:Event):void{
// 自分のメソッド内の最後で自分のメソッドが終わったことを通知する
flow.doneDepend(execA);
}
private function execB():void{
// たとえば、処理Bがさらに非同期処理の結果を待つ場合
foo.addEventListener(eventName,handleExecB);
}
private funciton handleExecB(e:Event):void{
//  このように実際に終わったときに依存が終了したことを伝える
foo.doneDepend(execB);
}

private function execC():void{
flow.doneDepend(execC);
}
private function execD():void{
flow.doneDepend(execD);
}
[/AS]

とこのようにすれば新たなクラスを作らなくて済むし、ちょっとした部分で非同期処理のスパゲティを回避できるのではないだろうか?
ここで、依存は関数にしたがとくに何であっても問題ない。
(関数にしたのは、コードヘルパが補完してくれるので間違いが起こりにくいので、それがいいと思っています。)

ただし、イベントの結果の中身で判断しなくてはないらない場合には、そのために関数を作るのも変ですし、
[AS]
flow.addDependsListener(execD,”FLAG_A”,”FLAG_B”);
[/AS]
のように記述もでき、
[AS]
flow.doneDepend(“FLAG_A”);
[/AS]
のように書くこともできます。

ちなみに、今まで処理が途中までやったけど、一度何もなかったことにしたい・・・という場合は
[AS]
flow.reset();
[/AS]
としてください。

ただし、依存関係を消すということはできません。(この場合にはインスタンスを作りなおしてね)

ソースはこちらから

お仕事のご依頼・相談を承ります
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら

Leave a Reply

お仕事のご依頼・相談
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら
ソフトウェア&ライブラリ




ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
執筆書籍
本、雑誌等

WEB記事:CodeZine
執筆記事はこちら
カレンダー
2009年8月
« 7月   9月 »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

カスタム検索
RSS
Add to Google < !–adsense–>
アーカイブ
カテゴリ
にほんブログ村 IT技術ブログへ