文章转载自:前端JS中,for循环里面执行ajax,ajax访问不到变量以及每次循环获取不到数据问题解决
我要实现的功能是打印一个审批表,审批表的表头是一样的,但是下面会有至少一个审批人记录
先个大家看一下示例代码
for(var i = 1;i < jsons.length;i++){
var name = jsons[i].approvalPeople;
var approvalOpinion = jsons[i].approvalOpinion;//审批意见
var approvalTime = jsons[i].approvalTime;//审批时间
var names = "";//审批职务
var img = "";
// ajax同步执行for循环
$.ajax({
type : 'POST',
url : '<%=contextPath%>/OrgUitlController/userRole?roleId='+name+'',
async: false,//设置成同步
dataType : 'json',
success : function(result) {
names = result.name;
img = result.img;
}
});
// 审批表的体
//initupdateForBody(employeeDetail,dialog,names||'',jsons[i].approvalOpinion||'',/\d{4}-\d{1,2}-\d{1,2}/g.exec(jsons[i].approvalTime)||'',img||'');
initupdateForBody(employeeDetail,dialog,names||'',approvalOpinion||'',approvalTime||'',img||'');
}
刚开始的时候,循环执行ajax请求获取不到变量。
问题的所在:for 循环是一个单线程的东西,而ajax是多线程的,之所以称之为异步同步,是因为执行到ajax的时候去后台开启了一个线程,但是for循环本身就是一个单线程的东西,那么执行到ajax的时候,ajax开启了一个线程,for循环是没有等他的,知道for循环结束的时候,才会把ajax返回的数据拿回来,所以会出问题。
解决办法:只需要把ajax改成同步的就可以了,每次for循环,都要去加载ajax方法,并且拿到他返回的数据,只需要在ajax中间加一个代码就可以搞定了。
// ajax同步执行for循环
$.ajax({
type : 'POST',
url : '<%=contextPath%>/OrgUitlController/userRole?roleId='+name+'',
async: false,//加上这一句设置成同步
dataType : 'json',
success : function(result) {
names = result.name;
img = result.img;
}
});