3

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

FuncA();

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

        FuncB();
    }
});

FuncC();

FuncD();

这里函数的执行顺序会是 ACDB 吗?

或者

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

提前感谢您的帮助。

4

3 回答 3

2

除非 ajax 请求是同步的,否则顺序将始终为 ACDB,但实际上不建议使用它,因为它会导致 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 的调用再次尝试。

于 2012-05-01T13:16:12.517 回答
0

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

于 2012-05-01T13:20:40.667 回答
-1

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

于 2012-05-01T13:46:17.567 回答