33 votes

La requête $ .ajax ({async: false}) continue de se déclencher de manière asynchrone?

J'ai eu un petit problème ici les gars. Je suis en train de mettre en œuvre le scénario suivant:
1 - Un utilisateur ouvre la page d'accueil et voit une liste d'autres utilisateurs et clique sur ajouter un à sa liste d'amis.
2 - je émettre une requête Ajax vers un serveur de ressources afin de valider si l'utilisateur est connecté, si oui, je émettre une autre requête ajax vers un autre serveur de ressources pour ajouter de l'utilisateur de la liste d'amis.
Cela paraît simple? Voici ce que j'ai fait: j'ai créé une fonction "isLoggedIn" qui émet la première demande au serveur, afin de déterminer si l'utilisateur est connecté. Je délivre la présente demande à l'aide de jQuery.ajax méthode. Voici ma fonction ressemble à:

function isLoggedIn() {

    $.ajax({
    async: "false",
        type: "GET",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        url: "/isloggedin",
        success: function(jsonData) {
            alert("jsonData =" + jsonData.LoggedIn);
            return jsonData.LoggedIn;
        }
    });
}

Le retour JSON est très simple, il ressemble à la suivante:

{ LoggedIn: true } or { LoggedIn : false }


Maintenant, cette méthode fonctionne réellement et affiche l'alerte correctement: "JsonData = true" si connecté, et "JsonData=false" si pas connecté.
Jusqu'à ce point, il n'y a pas de problème, le problème survient lorsque j'essaie d'appeler cette méthode: je l'appelle comme ça:

$(".friend_set .img").click(function() {
    debugger;
    if (isLoggedIn()) { 

        alert("alredy logged in");
        trackAsync();
        popupNum = 6;
    }
    else {
        alert("not logged in"); //always displays this message.
        popupNum = 1;
    }
    //centering with css

    centerPopup(popupNum);
    //load popup
    loadPopup(popupNum);
    return false;

});

L'appel de isLoggedIn renvoie toujours false, et elle retourne false avant de la requête ajax finitions (parce que le message "jsonData = true" est affiché après le message "pas connecté". J'ai fait en sorte que la demande n'est PAS Asynchrone en déclarant async: false!
Apparemment, c'est encore à travailler de manière asynchrone, si. Ce qui me manque ici, les gars?

62voto

Roatin Marth Points 9532

Vous avez besoin de async:false , pas async:"false" . (c.-à-d. transmettre les valeurs booléennes false , pas la chaîne "false" ).

Éditer: également avec les demandes asynchrones, vous devez renvoyer une valeur après l'appel à ajax , pas dans votre gestionnaire de succès:

 function isLoggedIn() {
    var isLoggedIn;
    $.ajax({
        async: false,
        // ...
        success: function(jsonData) {
            isLoggedIn = jsonData.LoggedIn
        }
    });
    return isLoggedIn 
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X