我有一个嵌套的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'/ p>
C
d
一
B'/ p>
C
d
正在发生的事情是:
如何解决此问题?
答案 0 :(得分:1)
每次通话需要一段时间才能执行,而您根本没有考虑到这一点。
你发出第一个GET请求,这可能需要几秒钟才能返回。您的JavaScript并不等待它发生并继续执行代码。
解决方案是引入类似" javascript promise"。一旦第一次调用实际完成并且你有响应数据,你基本上只调用函数b。
这是一篇帮助您入门的文章:https://davidwalsh.name/promises
不要停在这里,并阅读更多有关此主题的内容。你可以链接这样的多个事情,并根据需要进行行为。