2009-10-07 11 views
32

Ho un piccolo problema qui ragazzi. Sto cercando di implementare il seguente scenario:

  1. un utente apre la home page e vede un elenco di altri utenti e scatta di aggiungere uno alla sua lista amico.
  2. Invio una richiesta Ajax a una risorsa server per convalidare se l'utente è connesso, in tal caso, invio un'altra richiesta ajax a un'altra risorsa server per aggiungerla effettivamente all'elenco di amici dell'utente.

Suoni semplici? Ecco cosa ho fatto: ho creato una funzione isLoggedIn che emetterà la prima richiesta al server al fine di determinare se l'utente è loggato. Emetto questa richiesta usando il metodo jQuery.ajax. Ecco la mia funzione è simile:

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

La restituito JSON è molto semplice, esso appare come il seguente:

{ LoggedIn: true } or { LoggedIn : false } 

Ora questo metodo, in realtà funziona e visualizza l'avviso correttamente: JsonData = true se effettuato l'accesso, . e JsonData = false se non registrati in Fino a questo punto non c'è nessun problema, il problema si verifica quando si tenta di chiamare questo metodo: io lo chiamo in questo modo:

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

}); 

La chiamata isLoggedIn restituisce sempre false e restituisce 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`!

A quanto pare funziona ancora in modo asincrono, però. Cosa mi manca qui ragazzi?

+2

cosa importa se si specifica '{async:" false "}' vs. '{async: false}'? –

+0

@Cory Larson No, non importa, il fatto è che il metodo restituisce false prima che la richiesta ajax sia completata. – Galilyou

risposta

61

È necessario async:false, non async:"false". (ad esempio, passare la booleana false, non la stringa "false").

Edit: anche con le richieste asincrone è necessario restituire un valore dopo la chiamata a ajax, non all'interno del vostro gestore di successo:

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

@ 7alwagy: scusa, vedi la mia modifica. –

+0

Grazie bendewey! È sempre fastidioso vedere qualcuno modificare il mio post (continuo a dimenticare questa caratteristica), ma grazie. –

+4

il valore di ritorno dopo che il gestore di successo l'ha fatto! –

Problemi correlati