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循环,可以保证正常执行顺序:
随机推荐
- Nginx+Tomcat负载均衡群集
一.Nginx负载均衡原理 目前很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,提升整个站点的负载并发能力 Nginx负载均衡是通过反向代理实现的 二.部署Tomcat 本案 ...
- null、 is_null() 、empty() 、isset() PHP 判断变量是否为空
PHP中,在判断变量是否为空的时候,总会纠结应该选用哪个函数,下面列取常用的多种情况,其中1/3经过我的验证,其它来自网络,验证后使用... 使用 PHP 函数对变量 $x 进行比较 表达式 gett ...
- time 模块学习
前情提要: time模块是经常使用的模块.主要是用来记录时间,以及时间上的相关操作 一:时间戳 1:第一种形式 import time print(time.time()) 从1970 1 1 0:0 ...
- php 内存分配新
https://yq.aliyun.com/articles/38307 https://yq.aliyun.com/ziliao/132720 http://blog.liyiwei.cn/%E3% ...
- Java_异常处理(Exception)
异常:Exception try{ //捕获异常 }catch{ //处理异常 } 异常处理机制: 1.在try块中,如果捕获了异常,那么剩余的代码都不会执行,会直接跳到catch中, 2.在try之 ...
- PHP下的浮点运算不准的解决办法
首先看一段代码: 首先看一段代码: <?php $a = 0.1; $b = 0.7; var_dump(($a + $b) == 0.8); 打印出来的值居然为 boolean false P ...
- django在model中添加字段报错
在以下类中添加 description 字段后, class Colors(models.Model): colors = models.CharField(u'颜色', max_length=10) ...
- Java NIO学习与记录(五): 操作系统的I/O模型
操作系统的I/O模型 在开始介绍NIO Reactor模式之前,先来介绍下操作系统的五种I/O模型,了解了这些模型,对理解java nio会有不小的帮助. 先来看下一个服务端处理一次网络请求的流程图: ...
- 【Sonarqube】windows下更改Temp文件夹的位置
下载的最新Sonarqube版本(4.5.1),通过StartSonar.bat文件可以启动,但是无法通过StartNTService.bat文件启动,原因为默认的Temp文件不可写入, java.l ...
- 《LeetBook》LeetCode题解(1) : Two Sum[E]——哈希Map的应用
001.Two Sum[E] Two SumE 题目 思路 1双重循环 2 排序 3 Hashmap 1.题目 Given an array of integers, return indices o ...