循环内嵌套的ajax调用没有按顺序执行
Nested ajax calls inside a loop are not executing in order
我有一个嵌套的AJAX调用。
AJAX:function a(val){
var def = $.Deferred();
return $.ajax({
type : "get",
url : "myservlet",
beforeSend : function() {
$('#text1').css({
"color" : "red"
});
$('#text1').text("Running Graph");
},
data : {
"boxval" : val
}
}).done(function(responseText) {
$('#text1').css({
"color" : "green"
});
$('#text1').text(responseText);
}).then(function(){
return $.when(b());
});
}
function b(){
return $.ajax({
type : "get",
url : "ConnectServlet",
beforeSend : function() {
$('#text2').css({
"color" : "red"
});
$('#text2').text("Copying Files and preparing pSet");
}
}).done(function(responseText) {
$('#text2').css({
"color" : "green"
});
$('#text2').text(responseText);
}).then(function(){
return $.when(c());
});
}
function c(){
return $.ajax({
type : "get",
url : "CopyServlet",
beforeSend : function() {
$('#text3').css({
"color" : "red"
});
$('#text3').text("Running Dynamic Diff Graph");
}
}).done(function(responseText) {
$('#text3').css({
"color" : "green"
});
$('#text3').text(responseText);
}).then(function(){
return $.when(d());
});
}
function d(){
$('#summary').show();
}
我需要的是ajax调用的整个链(主ajax调用,函数b,函数c和函数d)按照循环的每次迭代顺序执行。
实际情况是,整个ajax主调用被执行,而不是在每次循环迭代时调用函数b。
我需要它做以下事情:
- b
- c
- d
- b
- c
- d
- …
实际情况是:
- … b
如何解决这个问题?
每个调用都需要一段时间来执行,而您根本没有考虑到这一点。
触发第一个GET请求,它可能需要几秒钟才能返回。JavaScript不会等待这种情况发生,而是继续执行代码。
一个解决方案是引入类似"javascript承诺"的东西。基本上只有在第一次调用实际完成并且您有响应数据时才调用函数b。
这里有一篇文章可以让你开始:https://davidwalsh.name/promises
不要停在这里,读更多关于这个主题的文章。你可以像这样链接多个东西,并在你需要的时候拥有它的行为。
相关文章:
- 使用appendChild()动态添加的脚本是按顺序执行还是并行执行
- 如何在angularjs中按顺序执行多数据ng应用程序
- 要按顺序执行的异步代码
- AngularJS:如何按照预定义的顺序执行函数
- 按顺序执行导入的 Javascript 函数
- 无法让 jQuery 以正确的顺序执行代码
- 触发后的 Javascript 顺序执行
- $http.post() angularjs 响应函数未按正确的顺序执行
- 如何按顺序执行 jQuery 函数
- 为什么Javascript不按顺序执行代码
- 对象在循环中运行时未定义,但在按顺序执行时未定义
- 按顺序执行ajax请求的动态编号
- javascript在网络上的顺序执行
- SQL语句是通过PhoneGap'按顺序执行的吗;的Web SQL数据库
- jQuery Deferred和Promise用于同步和异步函数的顺序执行
- 顺序执行js
- 如何按顺序执行承诺数组
- 有没有更好的方法以一定的顺序执行一堆部分异步的jQuery函数
- 如何确保 Dojo 模块按特定顺序执行
- 为什么我的 JavaScript 不能按顺序执行