我有一个相当复杂的功能,在提交表单时会做几个AJAX帖子,以验证值。根据POST返回的值,提交应该工作或失败。我认为这可以使用全局布尔值并在整个函数中将其值设置为true或false,然后在结尾检查布尔值是否已更改为“true”,如果是,则调用'return false;'。
但这失败了。我已经阅读了它,我认为这是因为AJAX调用是异步的,因此代码不会按顺序执行。
我的代码是这样的:
$('.to-step-3').click(function(){
var shape = '';
blnError = false;
$.post('/base/RoomBuilder/GetRoomShape.aspx', function(data) {
if(data.substring(0,5) == 'Error'){
alert(data);
blnError = true;
}else{
shape = data;
$.post('/base/RoomBuilder/GetRoomDimensions.aspx', function(data2) {
if(data2.substring(0,5) == 'Error'){
alert(data2);
blnError = true;
}else{
var arrDims = data2.split('_');
var l = arrDims[0];
var w = arrDims[1];
var sl = arrDims[2];
var ll = arrDims[3];
var sw = arrDims[4];
var lw = arrDims[5];
var failMessage = 'Please enter all required dimensions to build your room';
switch(shape) {
case 'square':
if(!(notNullOrEmpty(l))){
alert(failMessage);
blnError = true;
}
break;
case'rectangle':
if(!(notNullOrEmpty(l)) || !(notNullOrEmpty(w))){
alert(failMessage);
blnError = true;
}
break;
case'lshaped':
if(!(notNullOrEmpty(sl)) || !(notNullOrEmpty(ll)) || !(notNullOrEmpty(sw)) || !(notNullOrEmpty(lw))){
alert(failMessage);
blnError = true;
}
break;
case'lshapedalt':
if(!(notNullOrEmpty(sl)) || !(notNullOrEmpty(ll)) || !(notNullOrEmpty(sw)) || !(notNullOrEmpty(lw))){
alert(failMessage);
blnError = true;
}
break;
}
}
});
}
});
if(blnError == true){
return false;
}else{
return true;
}
});
我找到了一个类似jquery - return value from callback function (in post request) into the function its inside of?类似的例子,但是在我需要做的事情上我很难理解它(我不可能在Javascript上做得很好!)
有人可以指出我正确的方向,因为我一直盯着这个方向太久了!谢谢大家。
答案 0 :(得分:1)
jQuery post
本质上是异步的,因此在ajax响应到来之前if
条件已经执行。如果你想要执行等待直到ajax响应,那么你可以使用jQuery ajax
将async属性设置为false。试试这个
$.ajax({
url: '/base/RoomBuilder/GetRoomDimensions.aspx',
async: false,
type: 'post',
success: function(){
//Your logic here
}
});
//Now check the condition here
if(blnError == true){
return false;
}else{
return true;
}
答案 1 :(得分:0)
解决问题的最简单方法是将其作为同步调用,
$.ajaxSetup({async: false});
$.post(..);
$.ajaxSetup({async: true});