Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ExtJs:ajax调用中的代码执行顺序是什么?_Javascript_Ajax_Extjs_Asynchronous_Single Threaded - Fatal编程技术网

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

Javascript ExtJs:ajax调用中的代码执行顺序是什么?,javascript,ajax,extjs,asynchronous,single-threaded,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()或Fu

考虑到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()?如果是,那么在哪些条件下


提前感谢您的帮助。

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

例如,试试这个(最好是铬)

函数f1(){
var s='';
对于(变量i=0;i<10000000;++i){
s+=‘a’;
}
}
函数f2(){
var s='';
对于(变量i=0;i<10000000;++i){
s+=‘b’;
}
}
Ext.require('Ext.Ajax');
Ext.onReady(函数(){
变量d;
Ext.Ajax.request({
url:'data.json',
成功:函数(){
console.log('finished');
}
});
d=新日期();
f1();
log(新日期()-d,“f1完成”);
d=新日期();
f2();
log(新日期()-d,“f2完成”);
});
您将看到,尽管运行代码大约需要1s,但ajax请求总是最后发出,即使请求本身只需要7ms左右(这是一个本地框)。然后通过注释掉对f1/f2的调用重试。

A {B} C {B} D {B}
b可以在标记为{b}的所有位置执行。但将只执行一次。
编辑:-

不,javascript不是多线程语言。因此维护要执行的代码的
队列
。因此,当它到达
funcC
时,它开始执行
funcC
,然后在ii返回后,在队列中查找下一个要执行的函数,该函数可能是
funcB
(如果ajax请求完成)因此
funcB
只能在两个函数调用之间执行

请注意,javascript代码自上而下运行。因此,在本例中,代码执行将从
funcA()
开始,并在
funcD()
结束,但
funcB()
可以随时调用,因为它完全取决于
ajax.php
返回响应的速度

如果C函数需要很长时间怎么办?如果Ajax调用只需要很少的时间怎么办?没关系。在发出Ajax请求时至少会有一些延迟,而C&D方法将始终同步执行,因此在完成之前不会释放“锁”。换句话说,B被放入新的调用堆栈中,而C和D与A在同一个堆栈上。在下一个堆栈开始之前,每个堆栈都被完全处理。@Evantimboli:我完全同意你的看法。进行了类似的试验,得到了相同的结果。谢谢你的回答。谢谢你的帖子。那么这一切都取决于Ajax请求的完成吗?如果是这种情况,那么执行会突然跳到ajax函数的成功,并开始执行FuncB();一旦ajax完成?@ParvSharma:同意Evan的说法。B()总是只在C()和D()完成后执行。B()总是只在最后一次执行,在任何情况下都不会在C()或D()之前执行。谢谢你抽出时间。
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');

});