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 laasync
opció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
error
ysuccess
. 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: false
puede ser muy útil.async
con valorfalse
ha 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 alasync
parámetro delopen
método xhr , que es lo que usa jQuery).No estoy usando
$.ajax
las funciones$.post
y$.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
success
función para cargar la página apropiada en lugar de regresartrue
ofalse
.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
async
función como:fuente
async
funció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