2009-10-07 83 views
32

Tengo un pequeño problema aquí chicos. Estoy tratando de poner en práctica el siguiente escenario:

  1. un usuario abre la página principal y ve una lista de otros usuarios y clics para agregar uno a su lista de amigos.
  2. Emite una solicitud de Ajax a un recurso de servidor para validar si el usuario está conectado, si es así, emite otra solicitud ajax a otro servidor recurso para realmente agregarlo a la lista de amigos del usuario.

Sonidos simples? Esto es lo que hice: Creé una función isLoggedIn que emitirá la primera solicitud al servidor para determinar si el usuario está conectado. Emití esta solicitud usando el método jQuery.ajax. Aquí está mi función será similar a:

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

El regresó JSON es muy simple, se tiene el siguiente aspecto:

{ LoggedIn: true } or { LoggedIn : false } 

Ahora este método, realmente funciona y muestra la alerta correcta: JsonData = true si iniciada la sesión, . JsonData = false y si no se registra en hasta este punto no hay problema, el problema se produce cuando trato de llamar a este método: la llamo así:

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

}); 

Llamar a isLoggedIn siempre devuelve false, y devuelve 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`!

Aparentemente, sigue funcionando de forma asíncrona. ¿Qué me estoy perdiendo aquí chicos?

+2

qué importa si se especifica '{asíncrono:" falso "}' contra '{async: falso}'? –

+0

@Cory Larson No, no importa, el asunto es que el método devuelve falso antes de que la solicitud de ajax se complete. – Galilyou

Respuesta

61

Necesita async:false, no async:"false". (es decir, pase booleano false, no cadena "false").

Editar: también con las peticiones asíncronas necesita devolver un valor después la llamada a ajax, no dentro de su manejador de éxito:

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

@ 7alwagy: lo siento, mira mi edición. –

+0

Gracias bendewey! Siempre es desagradable ver a alguien editar mi publicación (sigo olvidándome de esa característica), pero gracias. –

+4

el valor de retorno después de que el controlador de éxito lo hizo! –

Cuestiones relacionadas