2010年4月8日 星期四

非同步指令實作


在Class內,開發好多個獨立基本功能的function,希望以這些獨立的functio
如同積木般去組合成各式不同應用,把這些function看成一個個獨立的command
這時候會需要可以做到,讓command可以非同步的依順序執行,在執行過程中,
提供給command的參數,除了是使用一般變數外,可能需要是上一個command作用
完的結果,再丟到下一個command內執行
要達到這目標,建立一個用來控制Command用的MultiCommander來處理所有要做的功能
包括提供
1.addCommand():讓使用者設定,當接收到什麼evnet,要去執行什麼command
2.dispatchComplete():在使用者所開發好的各項command function內,在執行
  command完成後,去執行dispatchComplete(),好讓控制流程的commander知道
  接下來要去執行哪個command
3.execute():呼叫,即開始執行整個command list
4.當有需要將上一個command執行的結果傳遞給下一個command當作參數去執行
  這部分利用外部一個共用object物件,把要傳遞的參數放到object內傳遞
  達到command要執行時,才讀到真正要給的變數值,而非一開始設定addCommand
  時提供的值

虛擬code

class MyClass{
 public const cmd1Complete:String = "cmd1Complete";
 public const cmd2Complete:String = "cmd2Complete";
 public var commander:MultiCommander;
 public var infoObj:Object = new Object();
 public function TestMultiCommander(){ 
  infoObj.x = 1;
  commander = new MultiCommander(this);
  commander.addEventListener(MultiCommander.CommandComplete, onCommandComplete);
  commander.addCommand(MultiCommander.CommandStart,run1,infoObj).addCommand(cmd1Complete,run2,infoObj).execute();
 }
 public function run1(_info:Object):void {
  _info.x++;
  trace("run1 infoObj.x=",infoObj.x)
  commander.dispatchComplete(cmd1Complete);  
 }
 public function run2(_info:int):void {
  _info.x++;
  trace("run2 infoObj.x=",infoObj.x)  
  commander.dispatchComplete(cmd2Complete);
 }
}

執行結果
run1 infoObj.x=2
run2 infoObj.x=3

說明
1.產生一個commander物件,並將commander所在的主程式class丟進去當參考
 commander=new MultiCommander(this)
2.設定所有會觸發的事件名稱,與用來交換資訊的物件
 private var Run1Complete:String="Run1Complete";
 private var Run2Complete:String="Run2Complete";
 public var infoObj:Object=new Object()
3.設定監聽所有指令列完成,所發出的通知
  commander.addEventListener(MultiCommander.CommandComplete, onCommandComplete);
4.加入要執行的command
  commander.addCommand(EventType,function,args...):MultiCommander
  EventType:設定當接收到這eventType時
  function:就會去執行設定的function
  args:可以放所有要給function執行的參數

  若是第一個執行的command,EventType設定就是用MultiCommander.CommandStart
  addCommand可以用串接方式執行
  例:
  commander.addCommand(MultiCommander.CommandStart,run1,...).addCommand(Run1Complete,run2,...)..

  如果要在各個command間交換的變數,希望在command執行時,才到上層取值的部分
  將通用的變數包裝在上層的infoObj物件,再將物件傳遞給command執行
5.所有執行的command,在完成時,都需dispatchComplete()
  例:
 
function run1(){
    ...
    commander.dispatchComplete(Run1Complete);
  }


6.執行
 
commander.execute();

沒有留言: