#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. Извините, но я новичок в программировании, не могли бы вы привести мне пример?