我一直在努力处理AJAX请求,目前正在用Javascript为twitter-bootstrap向导实现一些服务器端验证。我遇到了一些奇怪的行为,该函数在第一次执行时失败,但是第二次按预期工作。我已将代码简化为以下结构:
function do_ajax_validate($user,$email) {
$.ajax({url: "checkuser.php?field=username&query=" + $user, success: function(result){
if (result != 'Valid')
{
$("#userlabel").html(result);
$("#userdiv").addClass("has-error");
$("#userdiv").removeClass("has-success");
$("#username").focus();
is_good[0] = false;
} else {
$("#userlabel").html($user + " is available!");
$("#userdiv").removeClass("has-error");
$("#userdiv").addClass("has-success");
is_good[0] = true;
console.log(is_good[0]);
}
}});
console.log(is_good[0]);
$.ajax({url: "checkuser.php?field=email&query=" + $email, success: function(result){
if (result != 'Valid')
{
$("#emaillabel").html(result);
$("#emaildiv").addClass("has-error");
$("#emaildiv").removeClass("has-success")
$("#email").focus()
is_good[1] = false;
} else {
$("#emaillabel").html('Looks good!');
$("#emaildiv").removeClass("has-error");
$("#emaildiv").addClass("has-success")
is_good[1] = true;
}
}});
console.log(is_good[0]);
console.log(is_good[1]);
if ((is_good[0])&&(is_good[1])) {
return true;
} else {
return false;
}
}
每当我进入控制台并尝试运行该功能时,我都会使用一个我知道可用的用户/电子邮件来调用它,并获得以下输出:
do_ajax_validate('available_username', 'available@email.address');
false
false
false
每当我运行完全相同的行时,都会得到以下输出:
do_ajax_validate('available_username', 'available@email.address');
true
true
true
然后检查一个我知道的用户名/电子邮件,它将返回最后一个值:
do_ajax_validate('taken_username', 'taken@email.address');
true
true
true
(而且,您猜对了)-再次执行该函数将返回预期结果:
do_ajax_validate('available_username', 'available@email.address');
false
false
false
几个小时以来,我一直在尝试不同的方法,并且得到了同样奇怪的结果。我在做什么错了?
答案 0 :(得分:0)
Ajax调用在javascript中异步运行。您的success
回调仅在Ajax调用返回后才执行,因此您的console.log()
可以在success
函数执行之前被调用。
答案 1 :(得分:0)
对于此问题,您可以有两种解决方案:
async: false
,例如:$。ajax({ 网址:“ checkuser.php?field = username&query =“ + $ user, 异步:错误, 成功:功能(结果){ console.log(“结果”) }})