2009-10-12 6 views
1

J'ai une instruction if:JavaScript si (function_foo()) n'attend pas function_foo() pour terminer

if(authenticate_session("secret_password12345")){ 
     alert("You are authenticated"); 
    }else{ 
     alert("Intruder alert!"); 
    } 

et le javascript fonction d'authentification, ce qui en fait un appel AJAX jQuery POST au serveur faire l'authentification réelle, et renvoie true ou false:

function authenticate_session(session_id){ 
$.post("/auth.php", 
    { action: "authenticate_session", login_id: session_id }, 
    function(data){ 
     if(data == "denied"){ 
      alert("denied"); 
      return false; 
     }else if(data == "accepted"){ 
     alert("accepted"); 
      return true; 
     } 
    }, 
"text"); 
} 

Toutefois, lorsque l'instruction if invoque la fonction athentication, il ne l'attend pas AJAX pour terminer, et exécute toujours le « autre ». Si j'ajoute "return true" dans la première ligne de la fonction d'authentification, avant l'ajax, l'instruction if fonctionne comme attendu => alert ("Vous êtes authentifié").

Je sais que le côté serveur fonctionne correctement, car l'alerte ("denied") et l'alerte ("accepted") sont appelées comme prévu (mais de façon intéressante, après les alertes d'instruction if).

Comment faire pour que mon instruction if attende jusqu'à ce que la fonction d'authentification soit terminée?

Merci!

Répondre

5

Ce n'est pas en attente car c'est une requête asynchrone par défaut. Définissez le async option sur false pour qu'il soit synchrone. A partir de la documentation:

Par défaut, toutes les demandes sont envoyées asynchrones (à savoir ce paramètre est réglé à true par défaut). Si vous avez besoin de requêtes synchrones , définissez cette option sur false. Notez que les demandes synchrones peuvent verrouiller temporairement le navigateur, en désactivant toutes les actions pendant que la demande est active.

+0

Cette réponse semble bonne, mais régler les choses pour qu'elles soient synchrones n'a pas résolu le problème. Odd hein? – doctororange

+0

Ceci, en conjonction avec ma réponse, était le billet. – doctororange

+0

Vous ne devez jamais effectuer d'appels synchrones à partir du navigateur. Exposer la fonctionnalité synchrone quand XHR est utilisé dans le navigateur était la plus grande erreur dans la conception de ce composant. – NickFitz

3

je ne pense pas que vous pouvez faire si la déclaration « attendre » ajax, il suffit de déplacer la cette logique en fonction de rappel ajax (bien, vous avez réellement fait déjà: alert (refusé | accepté))

+0

merci - ceux-ci sont juste là pour le débogage. – doctororange

+0

Je ne vois pas pourquoi cet asnwer n'a pas encore été voté. Les appels synchrones «Ajax» (Sjax?) Sont souvent une source d'ennui. Définir une fonction de rappel est une solution beaucoup plus élégante. – Duroth

2

Il est dit précédemment. Ajax fait ce genre d'appels asynchrones. En attente de cela peut verrouiller votre navigateur (non désiré). Vous devriez donc utiliser une méthode de rappel pour gérer vos données. Cela gardera votre code responsable de faire les bonnes choses séparées.

function authenticate_session(session_id, callbacksuccess){ 
    $.post("/auth.php", 
    { action: "authenticate_session", login_id: session_id }, 
    callback, 
    "text"); 
} 

function callback(data) { 
    if (data == "denied") { 
    alert('denied'); 
    } else if (data == "accepted") { 
    alert('accepted'); 
    } 
} 

authenticate_session('secret_password12345", callback); 
0

Merci pour toutes vos réponses.

La réponse s'est avérée être que le retour dans la méthode ajax revenait de la méthode ajax, pas de la fonction d'authentification.