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

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

浏览 9004 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-13  
int08h 写道
既然是按顺序调用,就必须是按顺序结束的,AS是单线程执行的,你让他怎么才能做到“后开始的先完成”


AS是单线程没有错,按顺序调用没错,但并不能保证按顺序结束。
方法A先调用,发送请求到服务器,然后等待服务器返回,此时方法B启动,发送请求到服务器,然后也等待服务器返回。
没有任何机制保证方法A一定先于方法B返回到客户端。
0 请登录后投票
   发表时间:2011-07-13  
glovebx 写道
int08h 写道
既然是按顺序调用,就必须是按顺序结束的,AS是单线程执行的,你让他怎么才能做到“后开始的先完成”


AS是单线程没有错,按顺序调用没错,但并不能保证按顺序结束。
方法A先调用,发送请求到服务器,然后等待服务器返回,此时方法B启动,发送请求到服务器,然后也等待服务器返回。
没有任何机制保证方法A一定先于方法B返回到客户端。


你说的方式,一般我们是这么写的(我不会AS,大致写个样子)
function A() {
  // 做点事
  sendRequestA(url, data, callback);
  // 注意,这里A已经结束了
}
function B() {
  // 做另一点事
  sendRequestA(url, data, callback);
  // 注意,这里B已经结束了
}

因为A和B分别使用sendRequestA和sendRequestB和服务器通信,网络的操作是异步的,这导致sendRequestA的callback和sendRequestB的callback谁先执行是没有依据可寻的
但是,这2个callback的执行完全不影响函数A和函数B的结束,看上面的2行注释,函数的结束的概念我想大家还是一致的,函数执行完最后一条语句,自然就认为是结束了,从这一点上看,A和B的结束依旧是有顺序的
0 请登录后投票
   发表时间:2011-07-13  
glovebx 写道
int08h 写道
既然是按顺序调用,就必须是按顺序结束的,AS是单线程执行的,你让他怎么才能做到“后开始的先完成”


AS是单线程没有错,按顺序调用没错,但并不能保证按顺序结束。
方法A先调用,发送请求到服务器,然后等待服务器返回,此时方法B启动,发送请求到服务器,然后也等待服务器返回。
没有任何机制保证方法A一定先于方法B返回到客户端。

我的主帖已经提到不涉及网络通讯和资源加载了。。。这个当然是异步的
0 请登录后投票
   发表时间:2011-07-13  
int08h 写道
glovebx 写道
int08h 写道
既然是按顺序调用,就必须是按顺序结束的,AS是单线程执行的,你让他怎么才能做到“后开始的先完成”


AS是单线程没有错,按顺序调用没错,但并不能保证按顺序结束。
方法A先调用,发送请求到服务器,然后等待服务器返回,此时方法B启动,发送请求到服务器,然后也等待服务器返回。
没有任何机制保证方法A一定先于方法B返回到客户端。


你说的方式,一般我们是这么写的(我不会AS,大致写个样子)
function A() {
  // 做点事
  sendRequestA(url, data, callback);
  // 注意,这里A已经结束了
}
function B() {
  // 做另一点事
  sendRequestA(url, data, callback);
  // 注意,这里B已经结束了
}

因为A和B分别使用sendRequestA和sendRequestB和服务器通信,网络的操作是异步的,这导致sendRequestA的callback和sendRequestB的callback谁先执行是没有依据可寻的
但是,这2个callback的执行完全不影响函数A和函数B的结束,看上面的2行注释,函数的结束的概念我想大家还是一致的,函数执行完最后一条语句,自然就认为是结束了,从这一点上看,A和B的结束依旧是有顺序的


汗,原来异步操作中callback还未返回说是函数结束,我承认我败了。
手贱进来回这个帖子,太后悔了。
0 请登录后投票
   发表时间:2011-07-14  
"原来异步操作中callback还未返回说是函数结束"
--恩, 我也承认 我理解错了, 大侠门!!
0 请登录后投票
   发表时间:2011-07-14  
glovebx 写道
int08h 写道
glovebx 写道
int08h 写道
既然是按顺序调用,就必须是按顺序结束的,AS是单线程执行的,你让他怎么才能做到“后开始的先完成”


AS是单线程没有错,按顺序调用没错,但并不能保证按顺序结束。
方法A先调用,发送请求到服务器,然后等待服务器返回,此时方法B启动,发送请求到服务器,然后也等待服务器返回。
没有任何机制保证方法A一定先于方法B返回到客户端。


你说的方式,一般我们是这么写的(我不会AS,大致写个样子)
function A() {
  // 做点事
  sendRequestA(url, data, callback);
  // 注意,这里A已经结束了
}
function B() {
  // 做另一点事
  sendRequestA(url, data, callback);
  // 注意,这里B已经结束了
}

因为A和B分别使用sendRequestA和sendRequestB和服务器通信,网络的操作是异步的,这导致sendRequestA的callback和sendRequestB的callback谁先执行是没有依据可寻的
但是,这2个callback的执行完全不影响函数A和函数B的结束,看上面的2行注释,函数的结束的概念我想大家还是一致的,函数执行完最后一条语句,自然就认为是结束了,从这一点上看,A和B的结束依旧是有顺序的


汗,原来异步操作中callback还未返回说是函数结束,我承认我败了。
手贱进来回这个帖子,太后悔了。

class MyCallback extends Runnable {
    public void run() {
        // 睡上一天
        Thread.sleep(1000 * 60 * 60 * 24);
        System.out.println("callback");
    }
}
void A() {
    int[] bigArray = new int[1000000];
    for (int i = 0; i < bigArray.length; i++) {
        bigArray[i] = i;
    }
    Runnable callback = new MyCallback();
    // 异步带回调
    Thread thread = new Thread(callback);
    thread.start();
    System.out.println("end of A");
}

那么这样,在输出end of A之后,A有没有结束?bigArray这个对象能不能被GC回收?如果一个函数没有结束,那么其所持有的变量必定不能释放,请问是不是整整一天这个bigArray都要占用着至少38MB的内存?
0 请登录后投票
   发表时间:2011-07-14   最后修改:2011-07-14
glovebx 写道
int08h 写道
glovebx 写道
int08h 写道
既然是按顺序调用,就必须是按顺序结束的,AS是单线程执行的,你让他怎么才能做到“后开始的先完成”


AS是单线程没有错,按顺序调用没错,但并不能保证按顺序结束。
方法A先调用,发送请求到服务器,然后等待服务器返回,此时方法B启动,发送请求到服务器,然后也等待服务器返回。
没有任何机制保证方法A一定先于方法B返回到客户端。


你说的方式,一般我们是这么写的(我不会AS,大致写个样子)
function A() {
  // 做点事
  sendRequestA(url, data, callback);
  // 注意,这里A已经结束了
}
function B() {
  // 做另一点事
  sendRequestA(url, data, callback);
  // 注意,这里B已经结束了
}

因为A和B分别使用sendRequestA和sendRequestB和服务器通信,网络的操作是异步的,这导致sendRequestA的callback和sendRequestB的callback谁先执行是没有依据可寻的
但是,这2个callback的执行完全不影响函数A和函数B的结束,看上面的2行注释,函数的结束的概念我想大家还是一致的,函数执行完最后一条语句,自然就认为是结束了,从这一点上看,A和B的结束依旧是有顺序的


汗,原来异步操作中callback还未返回说是函数结束,我承认我败了。
手贱进来回这个帖子,太后悔了。

再者,函数的调用有一个“调用栈”的概念,如果一个函数没结束,那么这个函数肯定会在调用栈中出现。
那么再看看上面的代码
function callback() {
    var fn = arguments.caller;
    while (fn) {
        print(fn);
        fn = fn.caller;
    }
}
function A() {
    sendRequestA(url, data, callback);
}

按照你说的,当callback没结束之前,A函数并没有结束,那么我可以推断,在callback中打印调用栈,其栈上一定会有A这个函数
结果如何,是不是要实践一下呢?
0 请登录后投票
   发表时间:2011-07-16  
有所收获!
0 请登录后投票
   发表时间:2011-11-08  
我汗 把我弄晕了
0 请登录后投票
   发表时间:2011-11-08  
glovebx 写道
int08h 写道
既然是按顺序调用,就必须是按顺序结束的,AS是单线程执行的,你让他怎么才能做到“后开始的先完成”


AS是单线程没有错,按顺序调用没错,但并不能保证按顺序结束。
方法A先调用,发送请求到服务器,然后等待服务器返回,此时方法B启动,发送请求到服务器,然后也等待服务器返回。
没有任何机制保证方法A一定先于方法B返回到客户端。

支持这个说法  实际也是这样的 as3的事件机制就是异步的
0 请登录后投票
论坛首页 编程语言技术版

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