Eu tenho uma função do lado do servidor que requer login. Se o usuário estiver logado, a função retornará 1 em caso de sucesso. Caso contrário, a função retornará a página de login.
Eu quero chamar a função usando Ajax e jQuery. O que faço é enviar a solicitação com um link comum, com uma função de clique aplicada. Se o usuário não estiver conectado ou a função falhar, desejo que a chamada Ajax retorne true, para que o href seja acionado.
No entanto, quando eu uso o código a seguir, a função sai antes que a chamada do Ajax seja concluída.
Como redirecionar o usuário normalmente para a página de login?
$(".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;
}
}
});
});
Respostas:
Se você não deseja que a
$.ajax()
função retorne imediatamente, defina aasync
opção parafalse
:Mas, eu observaria que isso seria contrário ao ponto do AJAX. Além disso, você deve lidar com a resposta nas funções
error
esuccess
. Essas funções serão chamadas somente quando a resposta for recebida do servidor.fonte
async: false
. O loop de eventos do navegador será interrompido enquanto aguarda E / S de rede não confiável. Sempre há uma maneira melhor. Nesse caso, o destino do link pode verificar a sessão do usuário e 302 na página de login.async: false
pode ser muito útil.async
com valorfalse
foi descontinuado na maioria dos casos de uso do navegador. Pode lançar exceções na versão mais recente dos navegadores. Consulte xhr.spec.whatwg.org/#sync-warning (aplica-se aoasync
parâmetro doopen
método xhr , que é o que usa jQuery).Não estou usando,
$.ajax
mas as funções$.post
e$.get
, portanto, se precisar aguardar a resposta, utilizo o seguinte:fonte
O objeto XMLHttpRequest subjacente (usado pelo jQuery para fazer a solicitação) suporta a propriedade assíncrona. Defina como falso . Gostar
fonte
Em vez de definir async como false, que geralmente é um design ruim, considere bloquear a interface do usuário enquanto a operação está pendente.
Isso pode ser bem conseguido com as promessas do jQuery da seguinte maneira:
Com isso, agora você pode fazer:
E a interface do usuário bloqueará até que o comando ajax retorne
veja jsfiddle
fonte
Eu acho que as coisas seriam mais fáceis se você codificar sua
success
função para carregar a página apropriada em vez de retornartrue
oufalse
.Por exemplo, em vez de retornar,
true
você poderia fazer:Dessa forma, quando a função de sucesso é chamada, a página é redirecionada.
fonte
No JS moderno, você pode simplesmente usar
async
/await
, como:Em seguida, chame-o em uma
async
função como:fonte
async
função".Como não o vejo mencionado aqui, pensei em apontar que a instrução jQuery when pode ser muito útil para esse propósito.
O exemplo deles é assim:
A parte "then" não será executada até que a parte "when" termine.
fonte
Deve esperar até que a solicitação seja concluída. Depois disso, retornarei o corpo da solicitação get de onde a função é chamada.
fonte