包含jQuery $ .post()函数的函数的返回值

时间:2011-05-06 21:05:26

标签: javascript jquery ajax post return-value

我知道AJAX是异步的,所有这一切。但我有以下代码:

function doesUsernameExist(element)
{
    // Check via AJAX (POST) if username already exists in the database
    var funcReturned = null;
    $.post(
        '_ajax_checkexist.php',
        {
            var: 'username',
            value: element.value
        },
        function(data) {
            funcReturned = (data.toLowerCase() == 'exists');
        },
        'data'
    );
    return funcReturned;
}

我理解为什么该函数未正确返回值,但我可以将其用作解决方法?这适用于Validity插件,它需要 doesUsernameExist 函数返回的布尔值。我不能做通常的办法,让$ .post函数改变一些HTML元素。它需要将true / false返回到 doesUsernameExist

我可以使用哪种解决方法?我很难过。

2 个答案:

答案 0 :(得分:13)

如果呼叫是同步的,您可以返回一个值。这里有一个例子:

同步模式的解决方案:

function doesUsernameExist(element)
{
    // Check via AJAX (POST) if username already exists in the database
    var funcReturned = null;
    $.ajaxSetup({async: false});
    $.post(
        '_ajax_checkexist.php',
        {
            var: 'username',
            value: element.value
        },
        function(data) {
            funcReturned = (data.toLowerCase() == 'exists');
        },
        'data'
    );
    $.ajaxSetup({async: true});
    return funcReturned;
}

代码的问题在于,$.post正在执行时,函数会继续执行(这是异步的),因此会在null结束之前返回$.post

异步模式解决方案:
使用异步调用,您不能返回值,但可以调用回调或执行代码。这可能是异步解决方案:

function doesUsernameExist(element)
{    
    var funcReturned = null;
    $.post( //This post is asynchronous
        '_ajax_checkexist.php',
        {
            var: 'username',
            value: element.value
        },
        function(data) {
            funcReturned = (data.toLowerCase() == 'exists');
            userExistanceCallback(funcReturned);
        },
        'data'
    );
    //We don't return anything
}

function userExistanceCallback(funcReturned){
   if(funcReturned == true)
       alert("User exists!!");
   else
       alert("User does not exist!!");
}

希望这会有所帮助。干杯

答案 1 :(得分:2)

如果这是出于验证目的,您会发现jquery.validate plugin及其remote rule完全适合您要实现的目标。

因此,代替编写doesUsernameExist函数并担心AJAX的异步以及如何返回值,您将为您的表单编写验证规则(实际上这是您的最终目标) exercise =>专注于业务并将管道留给插件):

$('#id_of_some_form').validate({
    rules: {
        password: {
            required: true
        },
        username: { 
            remote: '_ajax_checkexist.php'
        }
    }
});