Возвращаемое значение для функции, содержащей функцию jQuery $ .post () - PullRequest
2 голосов
/ 07 мая 2011

Я понимаю, что 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 ]

13 голосов
/ 07 мая 2011

Вы можете вернуть значение, если вызов синхронный. Вот вам пример:

Решение для синхронного режима:

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!!");
}

Надеюсь, это поможет. Приветствия

2 голосов
/ 07 мая 2011

Если это для целей проверки, вы обнаружите, что плагин jquery.validate и его remote rule идеально адаптированы к тому, чего вы пытаетесь достичь.

Итак, вместо того, чтобы писать doesUsernameExist функций и беспокоиться о асинхронности AJAX и о том, как возвращать значения, вы будете писать правила проверки для вашей формы (что фактически является конечной цельюупражнение => сосредоточиться на бизнесе и оставить сантехнику плагинов):

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