由于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. logstash同步mongodb数据到elasticsearch

    一.安装logstash 二.安装mongodb插件 cd D:\Software\ELK5.5.0\logstash-5.5.0\bin logstash-plugin install logsta ...

  2. jquery源码解析:val方法和valHooks对象详解

    这一课,我们将讲解val方法,以及对value属性的兼容性处理,jQuery中通过valHooks对象来处理. 首先,我们先来看下val方法的使用: $("#input1").va ...

  3. SpringMvc redirect

    SpringMVC redirect 核心 首先网上百度到的资源基本已经够用, 留作记录. SpringMVC-redirect重定向跳转传值 虽然这哥们也是转的, 但又没有留源地址. 因此 ... ...

  4. 【3】JMicro微服务-服务超时,重试,重试间隔

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 接下来的内容都基于[2]JMicro微服务-Hello World做Demo 微服务中,超时和重试是一个最基本问题下面Dem ...

  5. Oracle数据库学习(四):学习中的遇到的问题

    一.xhost图形化界面安装问题 问题1:运行xhost +命令,出现命令没有找到错误 原因:Linux系统没有安装xhost图形化包. 解决办法:安装xhost图形化包,命令如下: yum what ...

  6. 本地搭建sass运行环境

    1.安装node.js 安装文件为msi文件,可到node.js官网下载安装包,下载路径为:https://nodejs.org/en/download/ 安装路径为默认路径,安装完成之后配置环境变量 ...

  7. Spring由于web配置导致的spring配置文件找不到的问题的解决方案

    在把某项技术整合到Spring中的时候,我们时常会发现报如下错误: org.springframework.beans.factory.BeanCreationException: Error cre ...

  8. windows下简单配置apache

    不得不做个笔记,不然每次配置都记不清楚... 详细的配置朋友这边写的很好.地址 # 对 PHP 4 LoadModule php4_module "c:/php/php4apache2.dl ...

  9. 【es6】正则扩展

  10. JavaScript自增、自减

    JavaScript自增.自减运算符与表达式语法 var i++; var-- 声明变量 i-- 变量名 ++ -- 自增运算符 JavaScript自增.自减运算符与表达式 JavaScript自增 ...