2009-10-07 2 views
32

Ich habe ein kleines Problem hier Jungs. Ich versuche, das folgende Szenario zu implementieren:

  1. Ein Benutzer öffnet die Homepage und sieht eine Liste von anderen Benutzern und klickt einen seiner Freundesliste hinzuzufügen.
  2. Ich eine Ajax-Anfrage an eine Server-Ressource zu überprüfen, ob der Benutzer angemeldet ist, wenn ja, ich eine andere Ajax-Anfrage an einen anderen Server Ressource, um es tatsächlich der Freundesliste des Benutzers hinzufügen.

Klingt einfach? Hier ist, was ich getan habe: Ich habe eine Funktion isLoggedIn erstellt, die die erste Anfrage an den Server ausgibt, um festzustellen, ob der Benutzer angemeldet ist. Ich stelle diese Anfrage mit jQuery.ajax Methode. Hier ist meine Funktion wie folgt aussieht:

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; 
     } 
    }); 
} 

Der zurück JSON sehr einfach ist, sieht es wie folgt aus:

{ LoggedIn: true } or { LoggedIn : false } 

Nun ist diese Methode tatsächlich funktioniert und zeigt die Warnung richtig: JsonData = true wenn Sie angemeldet sind, . und JsonData = false wenn nicht angemeldet bis zu diesem Punkt gibt es kein Problem ist, tritt das Problem auf, wenn ich versuche, diese Methode zu nennen: ich nenne es wie so:

$(".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; 

}); 

Der Aufruf isLoggedIn gibt immer false zurück und gibt false before the ajax request finishes (because the message zurück. JsonData = true is displayed after the message "not logged in". I made sure that the request is **NOT** Asynchronous by stating async: false`!

Anscheinend funktioniert es immer noch asynchron. Was vermisse ich hier Jungs?

+2

Spielt es eine Rolle, wenn Sie angeben '{async:" false "}' vs. '{async: false}'? –

+0

@Cory Larson Nein, ist es egal, die Sache ist, die Methode gibt false zurück, bevor die Ajax-Anfrage sogar abgeschlossen ist. – Galilyou

Antwort

61

Sie benötigen async:false, nicht async:"false". (d. h. pass boolean false, nicht String "false").

Edit: auch mit Asynchron-Anfragen benötigen Sie nach der Aufruf von ajax einen Wert zurückgeben, nicht in Ihrem Erfolg Handler:

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

@ 7alwagy: Entschuldigung, sehe meine Bearbeitung. –

+0

Danke bendwey! Es ist immer nervig, jemanden meinen Beitrag bearbeiten zu sehen (ich vergesse diese Funktion immer wieder), aber danke. –

+4

der Rückgabewert nach dem Erfolgs-Handler tat es! –

Verwandte Themen