在实际项目中会遇到each循环出来的数据 都去进行ajax去处理的情况 但是写在循环中去ajax是不可行的
为什么不可行?
因为遍历的数据和ajax并不能顺序执行 而是遍历完ajax还在处理中导致无法实现
循环是为了循环这个操作,而异步处理本身的意义就是为了不影响当前操作去实现的操作,所以循环在做这件事的时候
是不会去在乎你ajax是不是好了,俩个相当于没有任何先后顺序而言。
解决方案是 第一步先将需要处理的数据 遍历出来放入一个数组或集合中
然后在调用ajax去处理这个数组中的一个个对象 递归处理 这样就可以每个数据都进行了ajax
eg:
var strattr=new Array();
$('input[name="AddorUpData"]').each(function (i, v) {
var datetime = $(v).data("datetime");
var airline = $(v).data("airline");
var gateway = $(v).data("gateway");
var ids = strid;
var str = {"datetime":datetime ,"airline":airline,"gateway":gateway ,"ids":ids,"tishi":$(v).parent()};
strattr.push(str);
});
var times = strattr.length;
istrue(times,strattr,strid);
//循环已经存在数据进行判断是否符合选中团条件 times是指数组长度 strArr是遍历数组 strid是通过之后去加载有效数据的参数
function istrue(times, strArr,strid)
{
if (times <= 0) {
//表明所有参数都已经验证通过 那么就去加载下拉框数据
$.ajax({
url: "/AffordableWorld/PackageInfo/DepartureDateLIst",
type: "POST",
traditional: true,
data: {
"info": strid,
"adminKey": $("#hiddKey").val()
},
success: function (result) {
//先清空子元素
$("#Departdate").empty();
if (result.length > 0) {
//有满足的日期加载 然后在加载airline
$.each(result, function (i, item) {
var d = ChangeDateFormat(item.DepantureDate);//格式化日期
$("#Departdate").append("<option>" + d + "</option>");
});
GetAirline();
}
else {
//没有满足的条件就清空 影响的后俩个下拉框的子元素
$("#Airline").empty();
$("#Gateway").empty();
$("#Sold").text("");
$("#Sold").attr("value", 0);
}
}
});
}
else {
//检查参数是否满足 1.查出来的数据总和是不是和团数目相同 2.如果满足现查sold
var temp = times - 1;
$.ajax({
url: "/AffordableWorld/PackageInfo/IspackageUsable",
type: "POST",
traditional: true,
data: strArr[temp],
success: function (result) {
if (result == -1) {
//不满足条件 数据不兼容
check = "nopass";
strArr[temp].tishi.append("<span style='color:red'>*The newly selected group does not satisfy the information that currently exists</span>");
$("#Departdate").empty();
$("#Airline").empty();
$("#Gateway").empty();
$("#Sold").text("");
$("#Sold").attr("value", 0);
return false;
}
else {
strArr[temp].tishi.prev().prev().text(result);
times--;
istrue(times, strArr,strid); //递归调用
}
}
});
}
}