ExtJs:ajax调用中的代码执行顺序是什么?

时间:2012-05-01 13:06:08

标签: javascript ajax extjs asynchronous single-threaded

鉴于Javascript是一种单线程语言,ExtJs中以下代码中的执行顺序是什么?

FuncA();

Ext.Ajax.request({
    url: 'ajax.php',
    params: {
        id: 1
    },
    success: function(response){

        FuncB();
    }
});

FuncC();

FuncD();

这里的函数执行顺序是A-C-D-B?

或者

是否有可能在FuncC()或FuncD()之前调用FuncB()?如果是,那么在哪些情况下?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

除非ajax请求是同步的,否则订单将始终为A-C-D-B,但实际上并不建议使用它,因为它会导致UI挂起。

例如,试试这个(最好在Chrome中)

function f1() {
    var s = '';
    for (var i = 0; i < 10000000; ++i) {
        s += 'a';
    }
}

function f2() {
    var s = '';
    for (var i = 0; i < 10000000; ++i) {
        s += 'b';
    }
}

Ext.require('Ext.Ajax');

Ext.onReady(function() {

    var d;
    Ext.Ajax.request({
        url: 'data.json',
        success: function(){
            console.log('finished');
        }
    });

    d = new Date();
    f1();
    console.log(new Date() - d, 'f1 done');
    d = new Date();
    f2();
    console.log(new Date() - d, 'f2 done');

});

你会看到,即使运行代码需要大约1秒,ajax请求总是最后触发,即使请求本身只需要大约7毫秒(它是一个本地框)。然后通过注释掉对f1 / f2的调用再次尝试。

答案 1 :(得分:0)

一个 {B} C {B} d {B}
b可以在标记为{b}的所有位置执行。但只会执行一次。
编辑: -
没有javascript不是多线程语言。所以维护一个queue代码来执行。所以当它到达funcC时,它开始执行FuncC,然后在ii返回后查找要在队列中执行的下一个函数,该函数可能是funcB(如果ajax请求已完成),那么{ {1}}只能在2个函数调用之间执行

答案 2 :(得分:-1)

请注意,javascript代码从上到下运行。因此,在这种情况下,您的代码执行将从funcA()开始,并以funcD()结束,但funcB()可以随时调用,因为它完全取决于ajax.php返回响应的时间。