在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();
沒有留言:
張貼留言