J'ai une fonction côté serveur qui nécessite une connexion. Si l'utilisateur est connecté, la fonction renverra 1 en cas de succès. Sinon, la fonction renverra la page de connexion.
Je veux appeler la fonction en utilisant Ajax et jQuery. Ce que je fais, c'est soumettre la demande avec un lien ordinaire, avec une fonction de clic appliquée dessus. Si l'utilisateur n'est pas connecté ou que la fonction échoue, je veux que l'appel Ajax renvoie true, afin que le href se déclenche.
Cependant, lorsque j'utilise le code suivant, la fonction se ferme avant que l'appel Ajax ne soit effectué.
Comment puis-je rediriger gracieusement l'utilisateur vers la page de connexion?
$(".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;
}
}
});
});
Réponses:
Si vous ne souhaitez pas que la
$.ajax()
fonction revienne immédiatement, définissez l'async
option surfalse
:Mais, je noterais que ce serait contraire au point d'AJAX. Vous devez également gérer la réponse dans les fonctions
error
etsuccess
. Ces fonctions ne seront appelées que lorsque la réponse sera reçue du serveur.la source
async: false
. La boucle d'événements du navigateur se bloque pendant l'attente d'E / S réseau non fiables. Il y a toujours une meilleure façon. Dans ce cas, la cible du lien peut vérifier la session utilisateur et 302 sur la page de connexion.async: false
peut être très utile.async
avec valeurfalse
est devenu obsolète dans la plupart des cas d'utilisation du navigateur. Il peut lever des exceptions dans une version plus récente des navigateurs. Voir xhr.spec.whatwg.org/#sync-warning (s'applique auasync
paramètre de laopen
méthode xhr , qui utilise jQuery).Je n'utilise pas
$.ajax
les fonctions$.post
et$.get
, donc si j'ai besoin d'attendre la réponse, j'utilise ceci:la source
L'objet XMLHttpRequest sous-jacent (utilisé par jQuery pour effectuer la demande) prend en charge la propriété asynchrone. Réglez-le sur faux . Comme
la source
Au lieu de définir async sur false, ce qui est généralement une mauvaise conception, vous pouvez envisager de bloquer l'interface utilisateur pendant que l'opération est en attente.
Cela peut être bien réalisé avec les promesses jQuery comme suit:
avec cela, vous pouvez maintenant faire:
Et l'interface utilisateur se bloquera jusqu'à ce que la commande ajax retourne
voir jsfiddle
la source
Je pense que les choses seraient plus faciles si vous codiez votre
success
fonction pour charger la page appropriée au lieu de retournertrue
oufalse
.Par exemple, au lieu de revenir,
true
vous pouvez faire:De cette façon, lorsque la fonction de succès est appelée, la page est redirigée.
la source
Dans JS moderne, vous pouvez simplement utiliser
async
/await
, comme:Appelez-le ensuite dans une
async
fonction comme:la source
async
fonction".Comme je ne le vois pas mentionné ici, j'ai pensé que je soulignerais également que l' instruction jQuery when peut être très utile à cet effet.
Leur exemple ressemble à ceci:
La partie "alors" ne s'exécutera pas avant la fin de la partie "quand".
la source
Il devrait attendre la fin de la demande. Après cela, je reviendrai récupérer le corps de la requête d'où la fonction est appelée.
la source