我們都知道在FLEX中,我們寫的代碼都是異步執行的,所謂“異步”就是方法調用之後,當前線程並不阻塞以等待調用結果的返回,而是繼續執行下一行代碼(意思就是一行代碼執行完後,並不會立即得到結果,再執行下一行代碼。而是得不到結果,就繼續執行下一行代碼。最後FLASH PLAYER 中會有其它線程守候遠程方法調用的結果,通過事件的形式,通知應用進行相應的處理),看了一些書籍和資料,也做了一些實例,異步調用經常會引起的2個問題:
問題1:異步調用導致模型數據不一致。
由於FLEX的異步執行,就無法保證這些遠程調用的結果按順序返回,因此會造成調用參數與返回的結果不匹配,這就造成了數據模型的不一致。
問題2:異步調用導致用戶反覆誤操作。
由於FLEX在異步執行的時候,不會阻塞當前的線程,而此時用戶還可以繼續操作當前的人機界面 。如果遠程調用比較耗費性能,需要等上幾妙鍾才能返回,這時如果人機界面上沒有執行相應的處理 ,那麼就會有用戶認爲自己所做的操作沒起作用,就有可能一直執行這個操作,這樣多次連續重複請求服務器,就會浪費服務器資源,並且會引起用戶的誤操作。
那麼我們到底如何才能避免這種問題的出現呢?也就是我們怎麼樣才能在異步執行的時候,當執行完一句代碼後,立即得到結果的返回,再去執行下一句代碼呢?
我們可以使用回調函數。
1 首先我們可以自定義一個事件,在事件裏面加入回調函數。
package hatom.event
{
import flash.events.Event;
/**
* 類功能描述:todo(回調函數)
* @author hanshibo
* @version 1.0.0
* @創建時間: Aug 22, 20134:51:21 PM
*
*/
public class MyComboBoxEvent extends Event
{
/*按下鍵盤*/
public static const MY_KEY_DOWN:String = "myKeyDown";
/*打開列表*/
public static const OPEN_LIST:String = "openList";
//回調函數
public var callback:Function;
public function MyComboBoxEvent(type:String,$callback:Function = null)
{
super(type);
callback = $callback;
}
}
}
2 接着我們可以派發這個事件,使用回調函數處理並得到結果。
/**
* @private
*/
override mx_internal function keyDownHandlerHelper(event:KeyboardEvent):void
{
if(event.keyCode == Keyboard.ENTER)
{
tmpEvent = event;
dispatchEvent(new MyComboBoxEvent(MyComboBoxEvent.MY_KEY_DOWN,callback));
isOpenList = true;
}
else
{
super.keyDownHandlerHelper(event);
}
}
//回調
private function callback(index:Number):void
{
if(!isOpenList)
{
if(index >=6)
{
// 1 關閉下拉框並且平鋪列出剩餘數據 3 阻止 >6 的下拉數據的出現。
dispatchEvent(new MyComboBoxEvent(MyComboBoxEvent.OPEN_LIST));
}
else
{
super.keyDownHandlerHelper(tmpEvent);
}
}
else
{
super.keyDownHandlerHelper(tmpEvent);
}
}
3 在回調函數裏,我們設置了一個參數。那麼就需要給這個回調函數傳參。
hostComponent.addEventListener(MyComboBoxEvent.MY_KEY_DOWN,callbackHandler);
private function callbackHandler(event:MyComboBoxEvent):void
{
event.callback(selectNewIndex);
}
這樣,就可以解決問題了。當然解決異步所帶來的問題不只這一種。有什麼不對的地方,還請大家多多指正補充!