由于ajax异步请求的机制,for循环运行不会等内部ajax请求结束,而直接循环到最后。解决方法:将for循环里面的请求单独封装一个方法。

  个人遇到的问题具体如下

  下面这段代码,如果第5行studata存在多条数据,每次课程表的标题都为最后一个孩子的 学校名称+班级+孩子姓名。

 ////1:获取小孩和所在班级列表
GetStudentAndClassList(UserGuid, function (sdata) {
if (sdata.status == "success") {
//返回数据成功后获取各个班级课程表
var studata = sdata.data;
for (var i = 0; i < studata.length; i++) {
var classguid = studata[i].CLASSGUID; //班级Guid
var childname = studata[i].CHILDNAME;//小孩姓名
var zdxxmc = studata[i].ZDXXMC; //所在学校名称
var bj = studata[i].BJ;//班级名称
//zdxxmc +bj+childname为课程表标题
GetStudentKCB(classguid, function (jdata) {
if (jdata.status == "success") {
ShowKCBStudent(jdata.data, zdxxmc +bj+childname);
}
else {
alert(jdata.status);
}
});
}
}
else {
alert(jdata.status);
}
});
//获取小孩和所在班级列表ajax请求方法
function GetStudentAndClassList(UserGuid, CallBack) {
jQuery.ajax({
url: Common.GlobalSettings.VirtualDirectory + "/ashx/Curriculum.ashx",
type: "post",
data: { 'method': 'studentandclasslist', 'userguid': UserGuid },
dataType: "json",
success: function (studata) {
CallBack(studata);
},
error: function (XMLHttpRequest, txtStatus, errorThrown) {
Common.ErrorHandle(XMLHttpRequest.status + "|" + XMLHttpRequest.readyState + "|" + txtStatus + "|" + errorThrown);
Common.ErrorHandle("XXTApp/NewCurriculum.aspx"); } }); };
//获取学生课程表的ajax请求
function GetStudentKCB(ClassGuid, CallBack) { jQuery.ajax({
url: Common.GlobalSettings.VirtualDirectory + "/ashx/Curriculum.ashx",
type: "post",
data: { 'method': 'studentkcb', 'classguid': ClassGuid },
dataType: "json",
success: function (jdata) {
CallBack(jdata);
},
error: function (XMLHttpRequest, txtStatus, errorThrown) {
Common.ErrorHandle(XMLHttpRequest.status + "|" + XMLHttpRequest.readyState + "|" + txtStatus + "|" + errorThrown);
Common.ErrorHandle("XXTApp/NewCurriculum.aspx"); } });
}
//显示学生课程表
function ShowKCBStudent(data,KCBTitle) { //1: 清空课程表模板
$("#KCBMode").html(s);
$("#KCBTitle").html("<p class='CourseName'>" + KCBTitle+"的课表" + "</p>");
//2:读取课程表放到隐藏的模板中
for (var i = 0; i < data.length; i++) {
$("#" + data[i].WEEKDAY + "_" + data[i].CLASSNUM).attr("title", data[i].KCM + '教师:' + data[i].TEACHERNAME);
$("#" + data[i].WEEKDAY + "_" + data[i].CLASSNUM).attr("courseguid", data[i].COURSEGUID);
$("#" + data[i].WEEKDAY + "_" + data[i].CLASSNUM).html("<p class='CourseName'>" + data[i].KCM.substr(0, 1) + "</p><p class='ClassName'>" + data[i].TEACHERNAME + "</p>");
}
//3:读取模板中的课程表,放到新的table显示
//<div><table class="CurriculumTable" style="display: block" cellpadding="0" cellspacing="0" border="0">
var KCBhtml = "<div><table class=\"CurriculumTable\" style=\"display: block\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">";
KCBhtml += $("#KCBMode").html();
KCBhtml += "</table></div>";
//为了拼接后的课程表不影响模板,将ID换成KCBid之后再添加到Container div中
var KCB = KCBhtml.replace(new RegExp('id', 'gm'), "KCBid");
$("#Container").append(KCB);
}

结果如下:

解决后的结果:

解决方法,将for循环内的每次请求封装为一个单独的方法。修改后代码如下:

  //1:获取小孩和所在班级列表
GetStudentAndClassList(UserGuid, function (sdata) {
if (sdata.status == "success") {
//返回数据成功后获取各个班级课程表
var studata = sdata.data;
for (var i = 0; i < studata.length; i++) {
var classguid = studata[i].CLASSGUID; //班级Guid
var KCBTitle = studata[i].ZDXXMC + studata[i].BJ +studata[i].CHILDNAME;//学校+班级+姓名 作为课程表标题
GetKCBajax(classguid, KCBTitle);
}
}
else {
alert(jdata.status);
}
});
//由于ajax异步请求,在for循环会有问题。for循环不会等ajax请求返回结果结束,故单独封装成方法
function GetKCBajax(classguid, KCBTitle) {
GetStudentKCB(classguid, function (jdata) {
if (jdata.status == "success") {
ShowKCBStudent(jdata.data, KCBTitle);
}
else {
alert(jdata.status);
}
});
} //显示学生课程表
function ShowKCBStudent(data,KCBTitle) { //1: 清空课程表模板
$("#KCBMode").html(s);
$("#KCBTitle").html("<p class='CourseName'>" + KCBTitle+"的课表" + "</p>");
//2:读取课程表放到隐藏的模板中
for (var i = 0; i < data.length; i++) {
$("#" + data[i].WEEKDAY + "_" + data[i].CLASSNUM).attr("title", data[i].KCM + '教师:' + data[i].TEACHERNAME);
$("#" + data[i].WEEKDAY + "_" + data[i].CLASSNUM).attr("courseguid", data[i].COURSEGUID);
$("#" + data[i].WEEKDAY + "_" + data[i].CLASSNUM).html("<p class='CourseName'>" + data[i].KCM.substr(0, 1) + "</p><p class='ClassName'>" + data[i].TEACHERNAME + "</p>");
}
//3:读取模板中的课程表,放到新的table显示
//<div><table class="CurriculumTable" style="display: block" cellpadding="0" cellspacing="0" border="0">
var KCBhtml = "<div><table class=\"CurriculumTable\" style=\"display: block\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">";
KCBhtml += $("#KCBMode").html();
KCBhtml += "</table></div>";
//为了拼接后的课程表不影响模板,将ID换成KCBid之后再添加到Container div中
var KCB = KCBhtml.replace(new RegExp('id', 'gm'), "KCBid");
$("#Container").append(KCB);
}
//获取孩子以及所在班级列表
function GetStudentAndClassList(UserGuid, CallBack) {
jQuery.ajax({
url: Common.GlobalSettings.VirtualDirectory + "/ashx/Curriculum.ashx",
type: "post",
data: { 'method': 'studentandclasslist', 'userguid': UserGuid },
dataType: "json",
success: function (studata) {
CallBack(studata);
},
error: function (XMLHttpRequest, txtStatus, errorThrown) {
Common.ErrorHandle(XMLHttpRequest.status + "|" + XMLHttpRequest.readyState + "|" + txtStatus + "|" + errorThrown);
Common.ErrorHandle("XXTApp/NewCurriculum.aspx");
}
}); };
//获取学生课程表
function GetStudentKCB(ClassGuid, CallBack) { jQuery.ajax({
url: Common.GlobalSettings.VirtualDirectory + "/ashx/Curriculum.ashx",
type: "post",
data: { 'method': 'studentkcb', 'classguid': ClassGuid },
dataType: "json",
success: function (jdata) {
CallBack(jdata);
},
error: function (XMLHttpRequest, txtStatus, errorThrown) {
Common.ErrorHandle(XMLHttpRequest.status + "|" + XMLHttpRequest.readyState + "|" + txtStatus + "|" + errorThrown);
Common.ErrorHandle("XXTApp/NewCurriculum.aspx"); } });
}

For循环中由于ajax异步导致的问题解决(增加alert数据正常,去掉alert之后数据错误)的更多相关文章

  1. ajax使用中发现的问题与深入扩展(for循环中嵌套ajax)

    在学习ajax的过程中,我曾经遇到过这样的一个问题,为了得到一个详情列表,我要先向服务器去请求得到索引表,简单描述就是ajax中的success中的for循环中再次嵌套了ajax,结果第二层succe ...

  2. struts2中的Ajax异步校验

    登录时验证码的异步校验: 1.验证码生成的是图片因此在struts.xml文件里面配置action 时,result标签中type 属性是stream 2.验证码图片的src的值为配置action名字 ...

  3. ajax异步导致js方法顺序执行不了

    js两个方法调用的顺序,有时候是这样的 f1(); f2(); 本来是先执行f1的,但是如果f1里面进行ajax异步    async:true,那么可能会先执行f2,如果想要顺序执行,那么就把异步设 ...

  4. js中ajax异步导致的一些问题

    问题1:ajax默认是异步,所以在ajax中对外面定义的变量赋值,不能正确赋值 $("form").submit( var flag; $.ajax({ type: 'GET', ...

  5. Vue--axios:vue中的ajax异步请求(发送和请求数据)、vue-resource异步请求和跨域

    跨域原理: 一.使用axios发送get请求 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 & ...

  6. (转)函数中使用 ajax 异步 同步 返回值错误 主函数显示返回值总是undefined -- ajax使用总结

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAloAAAE0CAIAAAB7LwoKAAAgAElEQVR4nO2dy6sc152A6+/R2mXwSn ...

  7. prototype中的ajax异步加载

    jquery前台处理: var param = {a:a}; $.post("*.do",param,function(data) { var columHtml = " ...

  8. 在循环中如何取input的值和增加点击事件

    {volist name="dianpu" id="dianpu"} <input style="border: none;" rea ...

  9. for循环中嵌套异步请求问题

    for循环中嵌套了异步请求会导致顺序错乱,用递归代替for循环,可以保证正常执行顺序:

随机推荐

  1. [总结帖]Web小白的基础恶补帖

    1. jQuery实现按钮点击跳转网页 <script src="js/jquery/jQuery-2.2.0.min.js" type="text/javascr ...

  2. 人工鱼群算法超详细解析附带JAVA代码

    01 前言 本着学习的心态,还是想把这个算法写一写,给大家科普一下的吧. 02 人工鱼群算法 2.1 定义 人工鱼群算法为山东大学副教授李晓磊2002年从鱼找寻食物的现象中表现的种种移动寻觅特点中得到 ...

  3. Java 子类父类构造方法执行顺序

    public class Test { class Super { int flag = 1; Super() { test(); } void test() { System.out.println ...

  4. Codeforces Round #555 (Div. 3) C2. Increasing Subsequence (hard version)【模拟】

    一 题面 C2. Increasing Subsequence (hard version) 二 分析 需要思考清楚再写的一个题目,不能一看题目就上手,容易写错. 分以下几种情况: 1 左右两端数都小 ...

  5. Web安全学习笔记——SQL注入

    一.MySQL注入 1. 常用信息查询 常用信息: 当前数据库名称:database() 当前用户:user() current_user() system_user() 当前数据库版本号:@@ver ...

  6. mysql启动不起来

    在刚编译安装完成mysql,启动mysql时报了下面错误: /etc/init.d/mysqld start Starting MySQL... ERROR! The server quit with ...

  7. java.lang.Exception: The server rejected the connection: None of the protocols were accepted

    solution for this is from comment for https://issues.jenkins-ci.org/browse/JENKINS-29616. The follow ...

  8. Mac下锁屏快捷键

    ▲先设置“进入眨眼或开始屏幕保护程序”选择”立即“要求输入密码. [系统编好设置]->[通用] ▲通过快捷键[shift+control+光驱键]或者[option+command+关机键]

  9. 修改Eclipse jdk环境

    原因:由于项目原因,要将原有的工程从jdk1.6迁移到jdk1.7 问题:Eclipse默认的jdk环境为jdk1.6 解决方法: 1)首先是安装jdk1.7,以及配置环境变量,在这里就不再说了 2) ...

  10. JVM-ClassLoader类加载器

    类加载器: 对于虚拟机的角度来看,只存在两种类加载器: 启动类加载器(Brootstrap ClassLoader)和“其他类加载器”.启动类加载器是由C++写的,属于虚拟机的一部分,其他类加载器都是 ...