Возврат из Jquery.post

#jquery #ajax #post

#jquery #ajax #Публикация

Вопрос:

Мой текущий код:

 else{

$.post("ajax/ajax_login.php",
{register_username : $(selector).val()}
,function(ajax_data){
    if(ajax_data == 0){
        output_error(selector, "is already taken.");

        return false;
    }

});

output_error(selector, 0);
return true;
}
 

Как вы можете видеть, я делаю $.post, чтобы узнать, занято ли имя пользователя. ЕСЛИ он принят, ajax.php файл вернет значение 0. Значение if(ajax_data == 0) будет истинным.

Моя проблема: в этом операторе if я хочу вернуть false, а затем НЕ продолжить. Но вместо этого он продолжается из $.post, а также скрывает мой вывод.

Есть ли способ вырваться из этого $.post и НЕ продолжать работу с приведенным ниже кодом. (Я даже думаю, что приведенный ниже код выполняется ПЕРЕД кодом $.post)

Ответ №1:

Вызовы Ajax являются асинхронными, поэтому, да, код после $.post() действительно выполняется до завершения POST. Измените свой обработчик завершения на что-то вроде:

 if (ajax_data == 0)
    output_error(selector, "is already taken");
else
    output_error(selector, 0);
 

Обратите внимание, что вы не можете решить, что будет возвращать вызывающая функция, поскольку она уже завершила выполнение. Если вам нужно что-то передать обратно, вам также нужно настроить обратный вызов:

 function doSomethingWhichRequiresAPost(some_parameter,callback)
{
    // ... some other stuff ...
    $.post("ajax/ajax_login.php",
        {register_username : $(selector).val()},
        function(ajax_data)
        {
            if (ajax_data == 0)
            {
                output_error(selector, "is already taken.");
                callback(false);
            }
            else
            {
                output_error(selector, 0);
                callback(true);
            }
        }
    );
}
 

Теперь вместо того, чтобы вызывать вашу функцию и проверять ее возвращаемое значение, чтобы что-то сделать:

 if (doSomethingWhichRequiresAPost(parameter))
    // stuff to do if true
else
    // stuff to do if false
 

Вы передаете обратный вызов:

 doSomethingWhichRequiresAPost(parameter,function(ret)
    {
        if (ret)
            // stuff to do if true
        else
            // stuff to do if false
    }
);
 

Комментарии:

1. О, извините, но, кстати, это способ отключить это поведение? Чтобы сделать его не асинхронным?

2. Спасибо! Нет, это часть определения Ajax. Сначала это может немного озадачить, но как только вы привыкнете к этому, это не имеет большого значения. Просто переместите код, который вы бы поместили после него в обратном вызове, в основном.

3. Как мне настроить обратный вызов?

4. Обратный вызов — это функция, которую вы передаете $.post , которая обрабатывает результат. Если вам нужно передать информацию обратно в другое место, вы делаете то же самое, вы передаете функцию той, у $.post которой есть вызов, и вызываете эту функцию в обратном $.post вызове .

5. Извините, но я новичок в программировании, не могли бы вы привести мне пример?