调用嵌套的ajax时,最里面的ajax不起作用。如下例所示,我将getInnerResp调用为getResult。通常,当我使用firebug调试时,有趣的工作。我认为它表现为异步错误但我设置async属性为false不再工作。此外,我试图在getInnerResp函数中使用回调函数获取结果集。不幸的是,我没有以任何方式取得成功。此外,getResult函数中的ftbl变量返回null。 getInnerResp只返回结果;
结果
<tr><td colspan='3'></td></tr><tr><td colspan='3'></td></tr><tr><td colspan='3'></td></tr><tr><td colspan='3'></td></tr>
的Javascript
function getResult(year){
var visible = true;
var table = $(".tbl"), tbody = $(".result").find("tbody"), ftbl = "";
table.find("tbody>tr").each(function(){
var data = {
course : $(this).find(".course").val(),
year : year,
prog : $(this).find(".program").val()
}
if(year.length < 1){
alert("Year field can not be empty!!");
visible = false;
return false;
}
$.ajax({
url : "result.php",
method : "GET",
data : data,
contentType: "application/json; charset=utf-8",
traditional : true,
success : function(d){
tbody.append("<tr><td>" + course + "</td><td>" + d.enrolledStudent + "</td><td>" + d.failedStudent + "</td>");
if(visible){
ftbl += getInnerResp(course, year);
console.log("inner" + ftbl);
}
},
error : function(XMLHttpRequest, textStatus, errorThrown){
alert("Javascript runtime error: " + textStatus);
}
});
});
if(visible){
tbody.append(ftbl);
}
}
function getInnerResp(course, year){
var tbl = "";
var data = {
course : course,
year : year
}
for(var i = 0; i < 5; i++){
tbl += "<tr><td colspan='3'></td></tr>";
}
$.ajax({
url : "course.php",
method : "GET",
data : data,
contentType: "application/json; charset=utf-8",
success : function(json){
$.each(json, function(i, val){
tbl += "<tr><td>" + course + "</td><td colspan='2'>" + val + "</td></tr>";
});
},
error : function(XMLHttpRequest, textStatus, errorThrown){
alert(textStatus);
}
});
return tbl;
}
答案 0 :(得分:2)
这是你的问题:
ftbl += getInnerResp(course, year);
您尝试将将来生成的值(异步)分配给局部变量。
尝试在内部函数中移动任务,例如:
function getResult(year){
var visible = true;
var table = $(".tbl"), tbody = $(".result").find("tbody"), ftbl = "";
table.find("tbody>tr").each(function(){
var data = {
course : $(this).find(".course").val(),
year : year,
prog : $(this).find(".program").val()
}
if(year.length < 1){
alert("Year field can not be empty!!");
visible = false;
return false;
}
$.ajax({
url : "result.php",
method : "GET",
data : data,
contentType: "application/json; charset=utf-8",
traditional : true,
success : function(d){
tbody.append("<tr><td>" + course + "</td><td>" + d.enrolledStudent + "</td><td>" + d.failedStudent + "</td>");
if(visible){
//
// do the remaing in the inner task....
//
getInnerResp(course, year, tbody);
}
},
error : function(XMLHttpRequest, textStatus, errorThrown){
alert("Javascript runtime error: " + textStatus);
}
});
});
}
function getInnerResp(course, year, tbody){
var tbl = "";
var data = {
course : course,
year : year
}
for(var i = 0; i < 5; i++){
tbl += "<tr><td colspan='3'></td></tr>";
}
$.ajax({
url : "course.php",
method : "GET",
data : data,
contentType: "application/json; charset=utf-8",
success : function(json){
$.each(json, function(i, val){
tbl += "<tr><td>" + course + "</td><td colspan='2'>" + val + "</td></tr>";
});
tbody.append(tbl);
},
error : function(XMLHttpRequest, textStatus, errorThrown){
alert(textStatus);
}
});
console.log("inner" + tbl);;
}
答案 1 :(得分:1)
在getResult函数中ajax成功回调,&#39;当然&#39;正在使用变量但它没有在任何地方定义。它可能导致异常,这会使脚本执行在调用getInnerResp之前停止。