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循环,可以保证正常执行顺序:
随机推荐
- [ActionScript 3.0] as3启动QQ
import flash.html.HTMLLoader; import flash.net.URLLoader; import flash.net.URLRequest; import flash. ...
- Web安全篇之SQL注入攻击
在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问 ...
- Python【每日一问】16
问: [基础题]TCP/UDP/HTTP协议区别 [提高题]在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数, ...
- [Alpha]Scrum Meeting#5
github 本次会议项目由PM召开,时间为4月7日晚上10点30分 时长10分钟 任务表格 人员 昨日工作 下一步工作 木鬼 撰写博客目录 整理清明开会记录 SiMrua 模型再训练(issue#1 ...
- Java8内存结构—永久代(PermGen)和元空间(Metaspace)
本文转载 作者:liuxiaopeng 博客地址:https://www.cnblogs.com/paddix/p/5309550.html 一.JVM 内存结构 根据 JVM 规范,JVM 内存共分 ...
- npm install 报错: WARN checkPermissions Missing write access to 解决方案
经过各种百度搜索,发现这个问题的出现并不是管理员权限的问题,而是之前安装失败了,这个文件已经存在了,再次安装无法覆盖写入的问题. 解决方法: 1.找到node的全局安装路径,一般在nodejs文件夹的 ...
- 物联网学习之路——IoT概况
物联网IoT概念 IoT,Internet of Things,即物物相连的互联网.它包含两层意思:一,以互联网为基础:二,物物相连,实现信息的交换和通信.物联网通过智能感知.识别技术与普适计算等通信 ...
- 【ORACLE】oracle 日志文件管理
修改Oracle重做日志文件大小 创建新的日志组1 删除旧的日志组0(旧的日志组状态需要是INACTIVE) 创建新的日志组2,组名为旧的日志组0的组名 删除日志组1 ---------------- ...
- SVN linux 服务器端配置
一. SVN 简单介绍 Subversion(SVN) 是一个开源的版本号控制系統, 也就是说 Subversion 管理着随时间改变的数据. 这些数据放置在一个中央资料档案库 (repository ...
- Win10 VS2015 静态编译Qt5.6.2源码
由于VS2015需要CRT等拓展组件,因此把内部编写的工具软件以静态发布,固需要编译Qt源码.Qt5.6.2版本,VS2015,Win10 1.安装python,perl,下载jom 2.改文件com ...