Flex 是异步的...
这个大家应该是知道的...
那么,大家有没有对异步的开发方式困惑呢 ?
具体说就是...你不知道方法什么时候执行...
还是模糊,举个例子吧:
var request:URLLoader = new URLLoader(); request.addEventListener(Event.COMPLETE,loadStateInfo); request.load(new URLRequest(this.file));
这个是Flex 读取远程资源的例子
这个语句监听了加载的完成,然后执行loadStateInfo函数
如果你需要同步机制怎么办?
加入你需要远程加载完成之后
再执行一些函数?
有人说很简单啊,在监听函数里面执行不就行咯...
加入你执行的函数需要传入参数呢? 那你如何传参?
比如你加载完成后要执行以下函数:
protected function moveEffect(target:UIComponent,targetX:int,targetY:int):void { if (target.x != targetX || target.y != targetY) { var move:Move = new Move(target); move.xTo = targetX; move.yTo = targetY; move.play(); } }
那你如何将所需的targetX和targetY传入给这个函数呢?
监听事件中 event:Event 这个对象有吗?
所以,你有几种选择...
1) 全局变量 或者 类属性
这个方法有点笨...但是有时候有用...
具体就是,设置一个或多个全局变量作为“暂时存储”,当方法完成后,再传入要执行的函数
2) 闭包特性
也就是不写出方法名,只有方法体:
this.addEventListener(LoadDataEvent.LOADDATA_EVENT,function(event:Event):void{ abc(arg1, arg2); });
这样上面的arg1和arg2 这个2个参数,是局部的变量,但是使用了闭包这个特性
你就不用管它监听到事件后如何取得参数了,总之就是传进去了...
这样一说,大家会感觉闭包方法应该是非常好的...
但是...
我们必须又要面临的问题是...如果移除监听?
这个又成了难题...难道又用全局变量或者是属性?
那不成了第一个方法了?
如果监听的事件能像Timer类一样就好了...
/**延时执行.*/ var late:Timer = new Timer(300,1); late.addEventListener(TimerEvent.TIMER_COMPLETE,function(event:TimerEvent):void { removeElem(xFrom,yFrom); }); late.start();
这个上面的第二种方法一样,使用了闭包的特性...
但是..又加上了Timer的特点...指定了监听次数...所以不用自己移除方法...
当然,局限性也凸显了...你需要定时...
说来说去... 小弟也没有什么好点子...
所以向各位请教...
或许这个问题早就有方法解决了的... 只是因为小弟见识不广,而导致这样的疑虑...
望指教...