For循环中由于ajax异步导致的问题解决(增加alert数据正常,去掉alert之后数据错误)
由于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之后数据错误)的更多相关文章
- ajax使用中发现的问题与深入扩展(for循环中嵌套ajax)
在学习ajax的过程中,我曾经遇到过这样的一个问题,为了得到一个详情列表,我要先向服务器去请求得到索引表,简单描述就是ajax中的success中的for循环中再次嵌套了ajax,结果第二层succe ...
- struts2中的Ajax异步校验
登录时验证码的异步校验: 1.验证码生成的是图片因此在struts.xml文件里面配置action 时,result标签中type 属性是stream 2.验证码图片的src的值为配置action名字 ...
- ajax异步导致js方法顺序执行不了
js两个方法调用的顺序,有时候是这样的 f1(); f2(); 本来是先执行f1的,但是如果f1里面进行ajax异步 async:true,那么可能会先执行f2,如果想要顺序执行,那么就把异步设 ...
- js中ajax异步导致的一些问题
问题1:ajax默认是异步,所以在ajax中对外面定义的变量赋值,不能正确赋值 $("form").submit( var flag; $.ajax({ type: 'GET', ...
- Vue--axios:vue中的ajax异步请求(发送和请求数据)、vue-resource异步请求和跨域
跨域原理: 一.使用axios发送get请求 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 & ...
- (转)函数中使用 ajax 异步 同步 返回值错误 主函数显示返回值总是undefined -- ajax使用总结
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAloAAAE0CAIAAAB7LwoKAAAgAElEQVR4nO2dy6sc152A6+/R2mXwSn ...
- prototype中的ajax异步加载
jquery前台处理: var param = {a:a}; $.post("*.do",param,function(data) { var columHtml = " ...
- 在循环中如何取input的值和增加点击事件
{volist name="dianpu" id="dianpu"} <input style="border: none;" rea ...
- for循环中嵌套异步请求问题
for循环中嵌套了异步请求会导致顺序错乱,用递归代替for循环,可以保证正常执行顺序:
随机推荐
- [Bootstrap-Table] 中的事件用例
[Bootstrap-Table] 中的事件 -------------------------------------------------- <div class="alert ...
- [转] Cisco路由器DNS配置
禁用Web服务 Cisco路由器还在缺省情况下启用了Web服务,它是一个安全风险.如果你不打算使用它,最好将它关闭.举例如下: Router(config)# no ip http server 配置 ...
- SpringMvc @RequestMapping原理
讲这个之前,我们得先知道在SpringMvc启动时,会加载所有的Bean类,就是加了@Controller,@Component等组件标识的类,然后会把@RequestMapping的方法也加入到一个 ...
- 分享一些JAVA常用的学习网站
常用学习网站freecodecamp 一个非常好的网站,教学模式类似游戏中的闯关,通过每关之后会有成就感,在该网站还有设有聊天室,可以进行相关的技术交流,很棒的学习网站. https://www.fr ...
- 使用 Hexo + github 搭建个人博客
来自:http://www.cnblogs.com/fengzheng/p/8031518.html Hexo 是什么 Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或 ...
- Ubuntu18.04配制阿里巴巴的源
配制阿里巴巴的源步骤 使用阿里巴巴的开源镜像:https://opsx.alibaba.com/mirror 然后选择ubuntu的帮助选项,复制ubuntu18.04镜像源 设置root账户密码: ...
- python全栈开发_day15_函数回调和模块
一:函数回调 def a(fn=None): print("run1") if fn: fn() print("run 2") def b(): print(& ...
- Android Studio 学习笔记1.1 创建自己的第一个安卓项目并且打包APK
自从上一次安装完安卓开发工具Android Studio后抽时间看视屏尝试编写自己的第一个安卓项目约两周的时间 每天下班后会花上1~2小时的时间去学习 目前的成果如下:次元宅的我.apk 嘛 总而 ...
- Docker for Windows 启动失败,提示Kubernetes证书无效
起因 部署服务器到一台很久未更新的系统(windows 10),安装docker后,恰好系统自动更新,重启后docker不能启动,提示Kubernetes证书无效(未截到图,抱歉) 排查 因为没有开启 ...
- golang (4) golang 操作mongdb
1. 数据按照时间聚合操作 1.1 正常的数据结构 { "_id" : ObjectId("5cac8d7b1202708adf5d4b64"), " ...