Tengo una función del lado del servidor que requiere inicio de sesión. Si el usuario ha iniciado sesión, la función devolverá 1 en caso de éxito. Si no, la función devolverá la página de inicio de sesión.
Quiero llamar a la función usando Ajax y jQuery. Lo que hago es enviar la solicitud con un enlace ordinario, con una función de clic aplicada. Si el usuario no ha iniciado sesión o la función falla, quiero que la llamada Ajax devuelva verdadero, de modo que href se active.
Sin embargo, cuando uso el siguiente código, la función se cierra antes de que se realice la llamada Ajax.
¿Cómo puedo redirigir al usuario con gracia a la página de inicio de sesión?
$(".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;
}
}
});
});

Respuestas:
Si no desea que la
$.ajax()función regrese de inmediato, configure laasyncopción parafalse:Pero, me gustaría señalar que esto sería contrario al punto de AJAX. Además, debe manejar la respuesta en las funciones
errorysuccess. Esas funciones solo se llamarán cuando se reciba la respuesta del servidor.fuente
async: false. El bucle de eventos del navegador se bloqueará mientras espera E / S de red poco confiables. Siempre hay una mejor manera. En este caso, el objetivo del enlace puede verificar la sesión del usuario y 302 a la página de inicio de sesión.async: falsepuede ser muy útil.asynccon valorfalseha quedado obsoleto en la mayoría de los casos de uso del navegador. Puede arrojar excepciones en la versión más nueva de los navegadores. Consulte xhr.spec.whatwg.org/#sync-warning (se aplica alasyncparámetro delopenmétodo xhr , que es lo que usa jQuery).No estoy usando
$.ajaxlas funciones$.posty$.get, por lo que si necesito esperar la respuesta, uso esto:fuente
El objeto XMLHttpRequest subyacente (utilizado por jQuery para realizar la solicitud) admite la propiedad asincrónica. Ponlo en falso . Me gusta
fuente
En lugar de establecer asíncrono en falso, que generalmente es un mal diseño, es posible que desee considerar bloquear la interfaz de usuario mientras la operación está pendiente.
Esto se puede lograr muy bien con las promesas jQuery de la siguiente manera:
con esto ahora puedes hacer:
Y la interfaz de usuario se bloqueará hasta que regrese el comando ajax
ver jsfiddle
fuente
Creo que las cosas serían más fáciles si codificas tu
successfunción para cargar la página apropiada en lugar de regresartrueofalse.Por ejemplo, en lugar de regresar
true, podría hacer:De esa manera, cuando se llama a la función de éxito, la página se redirige.
fuente
En JS moderno, simplemente puede usar
async/await, como:Luego llámalo en una
asyncfunción como:fuente
asyncfunción".Como no lo veo mencionado aquí, pensé que también señalaría que la declaración jQuery when puede ser muy útil para este propósito.
Su ejemplo se ve así:
La parte "entonces" no se ejecutará hasta que finalice la parte "cuándo".
fuente
Debe esperar hasta que se complete la solicitud. Después de eso, devolveré el cuerpo de solicitud de donde se llama a la función.
fuente