Javascript ExtJs:ajax调用中的代码执行顺序是什么?
考虑到Javascript是单线程语言的事实,在ExtJs中,以下代码的执行顺序是什么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
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');
});