论坛首页 编程语言技术论坛

AS3.0事件侦听优先级确定的方法是按顺序线性执行么

浏览 9002 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-07  

  AS3.0事件侦听优先级确定的方法是按顺序线性执行么?事后才觉得问这个问题挺白痴的(遭到同事鄙视。。。),脚本执行,不涉及资源加载和远程调用,哪来的异步呢。。。。

  结论是线性执行,不论优先级高的那个方法要执行多久,后面的都会等着,这也提醒我们某个事件处理逻辑和算法写得不要过于复杂,否则会耽误后面的侦听函数执行。所有的侦听函数都被放在EventDispatcher的一个listeners数组里,不过应该是private的,开debug模式强行输出可以看到一些内容。有兴趣的继续看吧:

  我被绕进去,是来源于这段话:“给一个对象注册多个监听器,即使每个监听器的优先级别不同,但也无法保证后一个执行时前面的监听函数已经执行完毕。设计时,后面的函数不应该以前者执行完毕为条件。”---来源于Flex学习笔记_08 Flex的事件机制_高级应用

测试代码如下:  

 public class TestEvent extends Sprite

        {
                private var num:Number = 0;
                public function TestEvent()
                {
                        var testNum:int = 0;
                        for(var i:int = 0; i < 1000000; i ++){
                                testNum += i;
                        }
                        trace("the final num is:" + testNum);
                        initListener();
                        
                }
                private function initListener():void{
                        stage.addEventListener(MouseEvent.MOUSE_DOWN,func2,false,2);
                        stage.addEventListener(MouseEvent.MOUSE_DOWN,func3,false,3);
                }
                private function func2(event:MouseEvent):void{
                        trace("when do fun2,the num is:"+num);
                }
                
                private function func3(event:MouseEvent):void{
                        trace("func3 begin,the num is:" + num);
                        for(var i:int = 0; i < 1000000; i ++){
                                num += i;
                        }
                        trace("func3 complete,the num is:"+num);
                }
输出结果如下:
the final num is:1783293664
func3 begin,the num is:0
func3 complete,the num is:1783293664
when do fun2,the num is:1783293664

参考资料:

AS里事件到底是异步执行还是同步执行

   发表时间:2011-07-08  
恩! 是应该注意!
0 请登录后投票
   发表时间:2011-07-12  
应该是: 按顺序被调用的, 但不是按顺序结束的.
0 请登录后投票
   发表时间:2011-07-12  
smithfox 写道
应该是: 按顺序被调用的, 但不是按顺序结束的.

不是吧,你有依据么。。。。
你看看我上面的测试,func2最后才输出,输出的num是在func3中循环完毕的,而不是循环当中的一个值
0 请登录后投票
   发表时间:2011-07-13  
cuixuxucui 写道
smithfox 写道
应该是: 按顺序被调用的, 但不是按顺序结束的.

不是吧,你有依据么。。。。
你看看我上面的测试,func2最后才输出,输出的num是在func3中循环完毕的,而不是循环当中的一个值

priority 的值越大, 优先级越高, 3当然是先执行!!!!
0 请登录后投票
   发表时间:2011-07-13  
smithfox 写道
cuixuxucui 写道
smithfox 写道
应该是: 按顺序被调用的, 但不是按顺序结束的.

不是吧,你有依据么。。。。
你看看我上面的测试,func2最后才输出,输出的num是在func3中循环完毕的,而不是循环当中的一个值

priority 的值越大, 优先级越高, 3当然是先执行!!!!

3先执行当然没问题。。。我们争论的不是这个吧
你不是说,按顺序调用,不按顺序结束么。也就是说,先调用3,再调用2,但3可能未执行完时2就执行完了??
不知道你说的是不是这个意思。那假如是这样的话,func2输出的值应该不到1783293664,而且是在func3输出之前出现。

不知道我说明白没有
0 请登录后投票
   发表时间:2011-07-13  
既然是按顺序调用,就必须是按顺序结束的,AS是单线程执行的,你让他怎么才能做到“后开始的先完成”
0 请登录后投票
   发表时间:2011-07-13  
优先级确定的话, 就是顺序执行的, 开始结束然后再开始结束....
0 请登录后投票
   发表时间:2011-07-13  
int08h 写道
既然是按顺序调用,就必须是按顺序结束的,AS是单线程执行的,你让他怎么才能做到“后开始的先完成”

嗯,是这样的
0 请登录后投票
   发表时间:2011-07-13  
zhangjie.0211 写道
优先级确定的话, 就是顺序执行的, 开始结束然后再开始结束....

嗯,是这样的
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics