У меня есть функция на стороне сервера, которая требует входа в систему. Если пользователь вошел в систему, функция вернет 1 в случае успеха. Если нет, функция вернет страницу входа.
Я хочу вызвать функцию, используя Ajax и jQuery. Что я делаю, так это отправляю запрос с помощью обычной ссылки, к которой применена функция щелчка. Если пользователь не вошел в систему или функция не работает, я хочу, чтобы Ajax-вызов вернул true, чтобы сработал href.
Однако когда я использую следующий код, функция завершается до того, как будет выполнен вызов Ajax.
Как я могу изящно перенаправить пользователя на страницу входа?
$(".my_link").click(
function(){
$.ajax({
url: $(this).attr('href'),
type: 'GET',
cache: false,
timeout: 30000,
error: function(){
return true;
},
success: function(msg){
if (parseFloat(msg)){
return false;
} else {
return true;
}
}
});
});
Ответы:
Если вы не хотите, чтобы
$.ajax()
функция возвращалась немедленно, установитеasync
параметрfalse
:Но я хотел бы отметить, что это противоречило бы AJAX. Кроме того , вы должны обработки ответа в
error
иsuccess
функциях. Эти функции будут вызываться только при получении ответа от сервера.источник
async: false
. Цикл событий браузера будет зависать при ожидании ненадежного сетевого ввода-вывода. Всегда есть лучший способ. В этом случае цель ссылки может подтвердить сеанс пользователя и 302 на страницу входа.async: false
может быть очень полезно.async
со значениемfalse
больше не рекомендуется в большинстве случаев использования браузера. Это может вызвать исключения в более новой версии браузеров. См. Xhr.spec.whatwg.org/#sync-warning (относится кasync
параметруopen
метода xhr , который использует jQuery).Я не использую ,
$.ajax
но в$.post
и$.get
функции, поэтому если мне нужно ждать ответа, я использую это:источник
Базовый объект XMLHttpRequest (используемый jQuery для выполнения запроса) поддерживает асинхронное свойство. Установите это в ложь . подобно
источник
Вместо установки async в false, что обычно является плохим дизайном, вы можете рассмотреть возможность блокировки пользовательского интерфейса во время ожидания операции.
Этого можно добиться с помощью обещаний jQuery следующим образом:
с этим теперь вы можете сделать:
И пользовательский интерфейс будет блокироваться, пока не вернется команда ajax
смотри jsfiddle
источник
Я думаю, что было бы проще, если бы вы кодировали свою
success
функцию для загрузки соответствующей страницы вместо возвратаtrue
илиfalse
.Например, вместо возврата
true
вы можете сделать:Таким образом, когда вызывается функция успеха, страница перенаправляется.
источник
В современном JS вы можете просто использовать
async
/await
, например:Тогда вызовите это в
async
функции как:источник
async
функции».Поскольку я не вижу здесь упоминания, я подумал также, что оператор jQuery when может быть очень полезен для этой цели.
Их пример выглядит так:
Часть «then» не будет выполнена, пока не закончится часть «when».
источник
Следует подождать, пока запрос не будет завершен. После этого я верну тело запроса get, откуда вызывается функция.
источник