如何解决javascript的异步性问题?

时间:2013-06-27 01:20:17

标签: javascript forms asynchronous callback

我有一个简单的HTML表单。我正在尝试使用javascript对表单进行一系列验证。

$("#sign_in_form").submit(function(event){
    event.preventDefault();
    if(check_validity()){
        console.log("valid");
        return true;
    } else {
        console.log("invalid");
        return false;
    }

    console.log("end of function");    
});

现在check_validity()是一项耗时的功能。它检查数据库中的数据,然后回复true或false。但是在检查有效性完成之前,上述函数似乎不等待check_validity完成并运行else语句。

我该如何解决这个问题?可能使用回调函数可以解决这个问题。但是如何使用回调接收返回值?

function check_validity(){
    $.post("http://xxxx.com/check_if_user_exists",
    {email: $("#contact_person_email").val()},
    function(data){
        if(parseInt(data) == 1)
            return false;
        else
            return true;
    });
} 

1 个答案:

答案 0 :(得分:1)

使用jquery deferred

function check_validity(){
    return $.post("http://xxxx.com/check_if_user_exists", {
        email : $("#contact_person_email").val()
    }).then(function(data) {
        return parseInt(data, 10) != 1;
    });  // end of post 
} //end function 

用法:

check_validity().done(function(valid) {
    if (valid) {
        // ...
    }
});

但您仍然无法使用它来决定是否在true中返回falsesubmit()。这对于异步调用来说是不可能的。