2009-10-07 15 views
32

Mam tu mały problem. Próbuję zaimplementować następujący scenariusz:

  1. użytkownik otwiera stronę główną i widzi listę innych użytkowników i kliknięć dodać jeden na liście jego przyjacielem.
  2. Wystawiam żądanie Ajax do zasobu serwera w celu sprawdzenia, czy użytkownik jest zalogowany, jeśli tak, to ja wysyłam kolejne żądanie ajax do innego serwera , aby dodać go do listy znajomych użytkownika.

Brzmi prosto? Oto, co zrobiłem: Stworzyłem funkcję isLoggedIn, która wyda pierwsze żądanie do serwera w celu ustalenia, czy użytkownik jest zalogowany. Wyślę to żądanie, używając metody jQuery.ajax. Oto moja funkcja wygląda następująco:

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

Zwracany JSON jest bardzo prosta, to wygląda następująco:

{ LoggedIn: true } or { LoggedIn : false } 

Teraz ta metoda rzeczywiście działa i wyświetla alert poprawnie: JsonData = true jeśli zalogowany, . i JsonData = false jeśli nie zalogowany do tej pory nie ma żadnego problemu, problem pojawia się przy próbie wywołania tej metody: ja nazywam to tak:

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

}); 

Wywołanie zawsze zwraca false i zwraca false before the ajax request finishes (because the message jsonData = true is displayed after the message "not logged in". I made sure that the request is **NOT** Asynchronous by stating async: false`!

Wygląda jednak na to, że nadal działa asynchronicznie. Czego mi tu brakuje?

+2

to ma znaczenie, jeśli podasz '{async:" false "}' vs. '{async: false}'? –

+0

@Cory Larson Nie, to nie ma znaczenia, chodzi o to, że metoda zwraca wartość false, zanim żądanie ajax zostanie zakończone. – Galilyou

Odpowiedz

61

Potrzebujesz async:false, a nie async:"false". (tj. przechodzą boolean false, a nie ciąg "false").

Edit: również z asynchronicznych żądań trzeba zwrócić wartość po wezwanie do ajax, nie wewnątrz uchwytu sukcesu:

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

@ 7alwagy: Przepraszam, zobacz moją edycję. –

+0

Dzięki bendewey! Zawsze widać, że ktoś edytuje mój wpis (ciągle zapominam o tej funkcji), ale dzięki. –

+4

Wartość zwracana po tym, jak wykonawca sukcesu to zrobił! –

Powiązane problemy