在做项目的时候遇到了一个问题,在我写的投票页面里,一个是要显示他的投票的信息,另外一个要查询投票人数,一共要查询两个表,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>"
);
}//就在这里生成表格
为了检查我是否获取到了正确的统计结果,我插了一句
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确认,所以逐次赋值造表,出现了那个奇怪的情况。