關於FLEX異步調用

我們都知道在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);
			}

這樣,就可以解決問題了。當然解決異步所帶來的問題不只這一種。有什麼不對的地方,還請大家多多指正補充!








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章