关于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);
			}

这样,就可以解决问题了。当然解决异步所带来的问题不只这一种。有什么不对的地方,还请大家多多指正补充!








你可能感兴趣的:(flex)