关于ajax的同步和异步

     在做项目的时候遇到了一个问题,在我写的投票页面里,一个是要显示他的投票的信息,另外一个要查询投票人数,一共要查询两个表,js内代码是这样的:

//从数据库中得到数据封装到表格中,并改变分页。
	function doRecordTable(currentPage) {
		$.post("${basePath}/vote/votesAction!findVotes.action", {
			"page" : currentPage,
			"rows" : $("#setUp_pageSize").val(),
			"voteman" : $("#voteman").val(),
			"voteKeyWord" : $("#voteKeyWord").val(),
		}, function(data, status) { //这里的status是ajax自己的参数,请求成功就success 
			if (status == "success") {
				var json = $.parseJSON(data);
				doTable(json);
			} else {
				customShowDialog("connection error");
			}
		});
	};

	//把json封装到表格中,并改变页码
	function doTable(json) {
		//页码开始
		var begin = 0;
		//页码结束
		var end = 0;
		
		
		//先移除表格中的数据
		$("#votesTableBody>tr").remove();

		//移除页码
		$(".pagination>li").not(":first").not(":last").remove();

		//设置好页码信息(ps:基类里面已计算好)
		$(".showPageSize").children("span").eq(0).html(json.page);
		$(".showPageSize").children("span").eq(1).html(json.total);
		$(".showPageSize").children("span").eq(2).html(json.records);

		//判断是否有数据
		if (json.rows.length == 0) {
			$("#votesTableBody").append("<tr><td colspan='9'>暂无投票</td></tr>");
		}

		//往表格中插入数据
		for (var i = 0; i < json.rows.length; i++) {
		   var opnum = 0 ;
		    //获取投票数量
		  $.post("${basePath}/vote/OptionsAction!findOpNum.action", {
                        "id" : json.rows[i].id
                        }, function(data, status) { //这里的status是ajax自己的参数,请求成功就success 
<span style="white-space:pre">			</span>if (status == "success") {
<span style="white-space:pre">				</span>opnum=num;
<span style="white-space:pre">			</span>} else {
<span style="white-space:pre">				</span>customShowDialog("没id啊");
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>});
		 
			if (json.rows[i].id == null) {
				json.rows[i].id = "";
			}

			if (json.rows[i].title == null) {
				json.rows[i].title = "";
			}

			if (json.rows[i].username == null) {
				json.rows[i].username = "";
			}

			if (json.rows[i].begin_time == null) {
				json.rows[i].begin_time = "";
			} else {
			    json.rows[i].begin_time = json.rows[i].begin_time.substring(0,10);
			}

			if (json.rows[i].stop_time == null) {
				json.rows[i].stop_time = "";
			} else {
			    json.rows[i].stop_time = json.rows[i].stop_time.substring(0,10);
			}

			if (json.rows[i].type == null) {
				json.rows[i].type = "";
			} else if (json.rows[i].type == 0) {
				json.rows[i].type = "单选";
			} else if (json.rows[i].type == 1) {
				json.rows[i].type = "多选";
			}
			
			if (json.rows[i].state  == null) {
				json.rows[i].state = "";
			} else if (json.rows[i].state == 0) {
				json.rows[i].state = "投票结束";
			} else if (json.rows[i].state == 1) {
				json.rows[i].state = "正在投票";
			}
            
			$("#votesTableBody")
					.append( //原始造表,可以找插件写(jqgrid),其实差不多
							"<tr class='odd' role='row'><td class='center'>"+json.rows[i].username+"</td><td><a style=\"cursor:pointer\" onclick=\"clickVote('"+json.rows[i].id+"','"+json.rows[i].type+"','"+json.rows[i].title+"')\">"
									+ json.rows[i].title
									+ "</a></td><td>"
									+ opnum
									+ "</td><td>"
									+ json.rows[i].type
									+ "</td><td>"
									+ json.rows[i].begin_time
									+ "</td><td>"
									+ json.rows[i].stop_time
									+ "</td><td>"
									+ json.rows[i].state
									+ "</td><td><div class='hidden-sm hidden-xs action-buttons'>"
									+"<a title=\"查看投票结果\" style=\"cursor:pointer\" class='blue' onclick='click()'><i class='ace-icon fa fa-search-plus bigger-130'></i></a>"
							//		+"<a style=\"cursor:pointer\" class='green' onclick='clickTo(xg)'><i class='ace-icon fa fa-pencil bigger-130'></i></a>"
							//		+"<a style=\"cursor:pointer\" class='red' onclick='clickTo(sc)'><i class='ace-icon fa fa-trash-o bigger-130'></i></a>"
									+"</div></td></tr>"
					);
		}//就在这里生成表格 



结果发现统计结果并没有正确显示,而是我设置的初值0


为了检查我是否获取到了正确的统计结果,我插了一句

alert(opnum);

在造表前,结果奇怪的事情发生了!



正确的结果获取出来了,但是弹窗还是我的初始值0!这到底是为什么呢?


在百度各种资料后,还是好朋友的一句话提醒我了,这种奇怪的不同步,是ajax异步获取造成的!


$.post默认是异步的,所以我只好把第二个ajax用回标准格式

 //获取投票数量
		   $.ajax({  
		         type : "post",  
		         url : "${basePath}/vote/OptionsAction!findOpNum.action",  
		         data : {"id" : json.rows[i].id},  
		         async : false,  //同步处理
		         success : function(num, status) { //这里的status是ajax自己的参数,请求成功就success 
							if (status == "success") {
								opnum=num;
								
							} else {
								customShowDialog("没id啊");
							}
			              } 
		   }); 

试验一下之后问题确实已经解决了。



关于ajax同步异步我是在这里看到的=。=:http://blog.youkuaiyun.com/yanfangphp/article/details/8261333


这次问题的出现,是因为我在获取完投票人数统计之前,第一个ajax已经完成了造表,所以set的数据也是我的初始值0;而在加了alert之后,因为每次循环都要等待alert确认,所以逐次赋值造表,出现了那个奇怪的情况。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值