为什么直到第二次调用AJAX / Javascript函数才能正常工作?

时间:2019-06-29 04:42:10

标签: javascript ajax validation

我一直在努力处理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

几个小时以来,我一直在尝试不同的方法,并且得到了同样奇怪的结果。我在做什么错了?

2 个答案:

答案 0 :(得分:0)

Ajax调用在javascript中异步运行。您的success回调仅在Ajax调用返回后才执行,因此您的console.log()可以在success函数执行之前被调用。

答案 1 :(得分:0)

对于此问题,您可以有两种解决方案:

  1. 在分配给成功属性的回调中处理结果。尝试在成功属性下控制台结果
  2. 在AJAX调用下使用async: false,例如:
  

$。ajax({          网址:“ checkuser.php?field = username&query =“ + $ user,          异步:错误,          成功:功能(结果){          console.log(“结果”)          }})