关于Ajax的同步异步问题

本文描述了在一个项目中使用jQuery Ajax遇到的问题,即在非debug环境下保存表单时,会因异步请求导致数据被意外覆盖。通过设置Ajax请求为同步方式解决了此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:
在做项目的过程中,碰到了如下一个问题,花了我两天的时间、、、⊙﹏⊙b汗
问题起因:由于在项目中使用的是Jquery Ajax保存的表单,现在页面上有如下两个表单:
form,和subform,
其中form中的主要内容是几个checkbox和文本框
subform中的主要内容是三个文件上传框

[img]http://dl.iteye.com/upload/attachment/283382/1c0f9401-72cf-370f-a013-c49e8b3b25e9.png[/img]

后台jQuery代码如下:
function submitAdminForm2(formName) {
clearError();
if(isNaN($("#pdaysvalue").val())){
alert("Please enter number for Person days! ");
return false;
}
frm = document.getElementById(formName);
frmsub = document.getElementById(formName + "sub");

var options = {
//target: "#errormessage",
success: showResponse, // post-submit callback
error: function(XMLHttpRequest, textStatus, errorThrown) {
location.href = "../../error/c500Error.jsp?exception=clear";
}
};
if(frmsub == null) {
$(frm).ajaxForm(options);
$(frm).submit();
} else {
//if($("#logo1").val() != null && $("#logo1").val() != ""||
// $("#applogo1").val() != null && $("#applogo1").val() != ""||
// $("#char1").val() != null && $("#char1").val() != ""
// ) {
$("#hiddenlogo1").val($("#logo1").val());
$("#hiddenapplogo1").val($("#applogo1").val());
$("#hiddenchar1").val($("#char1").val());

$(frm).ajaxForm(options);
$(frm).submit();
//}
$(frmsub).ajaxForm(options);
$(frmsub).submit();
}
}

现在症状如下:
当点击保存的时候(由于项目的特殊性,数据都是保存在对应目录下的configurator_XX.properties文件中而非保存在数据库中),每当在form中上传本地图片文件后,点击【save】后保存结果是正确的,但是当我点击【clean logo】按钮后再点击【save】发现数据文件configurator_XX.properties会被覆盖掉,仅仅只是保存当前的几个结果,但是这个时候如果进行debug的话,这个现象是不会重现,但当在非debug时,又会出现这个问题,分析过后台的业务逻辑并没有出现错误。
后来经过高人指点由于jQuery Ajax是异步执行的,这个时候由于提交的两个form如果不是在同步执行的情况下就会出现以上现象,因此,在上面的代码处添加一行:(用红色标记):
var options = {
//target: "#errormessage",
[b][color=red]async:false,[/color][/b]
success: showResponse, // post-submit callback
error: function(XMLHttpRequest, textStatus, errorThrown) {
location.href = "../../error/c500Error.jsp?exception=clear";
}
};

至此,该错误宣告结束O(∩_∩)O~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值