2010-05-16 23 views
5

Estoy tratando de utilizar el retorno de una llamada jQuery ajax en mi propia función, pero sigue volviendo indefinido.return from jquery ajax call

function checkUser2(asdf) { 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: "check_user.php", 
     data: { name: asdf }, 
     success: function(data){ 
      return data; 
      //alert(data); 
     } 
    }); 
} 

$("#check").click(function(){ 
    alert(checkUser2("muma")); 
}); 

la llamada ajax definitivamente las obras, porque cuando mi alerta de Descomentar consigo el retorno correcta, y puedo verlo en Firebug. ¿Estoy haciendo algo estúpido?

Respuesta

7

La llamada AJAX es asíncrona, esto significa que la solicitud AJAX se realiza fuera de orden de la ejecución habitual del programa, y ​​en su programa eso significa que checkUser2() no está devolviendo datos a la alerta.

No puede usar los valores de retorno de las llamadas $.ajax() de esta manera, sino que mueve el código que utiliza los datos de retorno AJAX a la función success(), para qué sirve.

1

Tal vez puedas probar:

function checkUser2(asdf) { 
    var result; 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: "check_user.php", 
     data: { name: asdf }, 
     success: function(data){ 
      result = data;    
     } 
    }); 
    return result; 
}  


$("#check").click(function(){ 
    alert(checkUser2("muma")); 
}); 

Puede que tenga que mover la variable de resultado como una variable global en vez de JavaScript. No he probado esto todavía.

+1

Sincrónico ajax es una muy mala idea sin embargo. – Pointy

+0

Estoy de acuerdo, pero era una forma de resolver el problema que tenía el OP. Y ya estaba usando la función ajax de forma asíncrona. – Falle1234

+0

De esta manera tampoco funcionó para mí. $ ("# submitPO"), haga clic en (función() { alerta (updatePO ("444")); }); no se activó una alerta. Mi función está estructurada de la misma manera que la tuya. –

3

Se podría hacer esto, pienso:

function checkUser2(asdf) { 
    var s = $.ajax({ 
     type: "POST", 
     async: false, 
     url: "check_user.php", 
     data: { name: asdf }, 
     success: function(data){ 
      return data; 
      //alert(data); 
     } 
    }).responseText; 
    return s; 
}  

pero, como en el cuarto ejemplo de la jquery doc page for ajax function dice, creo que

Bloques del navegador, mientras que las solicitudes están activos. Es mejor bloquear la interacción del usuario> por otros medios cuando la sincronización es necesaria.

+0

Esto soluciona el problema que tenía en casi el mismo escenario, ya que el "async: falso" era la parte clave para detener la llamada de forma asincrónica. –

0

También puede almacenar los "datos" utilizando el método de datos de jQuery y asociarlo con un objeto jQuery global o selector local jQuery. Por ej.

success: function(data) { 
    $.data('result', data); 
} 

El valor de retorno se la puede acceder en cualquier lugar usando

$.data('result') 

También puede asociar este a una variable local (por ejemplo, $ ('# myid'). Datos()) de manera que su local para ese objeto en lugar de en el alcance global.

+0

Intenté usar su sugerencia. No pude hacer que funcione. $ ("# submitPO"), haga clic en (función() { alerta ($. datos ('resultado')); }); Hice nada. –

Cuestiones relacionadas