2009-04-20 17 views
6

Tengo una función de JavaScript que llama a una función genérica para realizar una llamada ajax al servidor. Necesito recuperar un resultado (verdadero/falso) de la función de devolución de llamada de la llamada ajax, pero el resultado que obtengo siempre es 'indefinido'.Promover la devolución de llamada en el valor de retorno de éxito al valor de retorno de la función del llamador

Una versión super-simplificada de la función genérica sin toda mi lógica sería:

function CallServer(urlController) { 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic) 
        return true; 
       else 
        return false; 
      }, 
     error: 
      function(errorThrown) { 
       return false; 
      } 
    }); 
} 

Y la función de llamada que sería algo así como:

function Next() { 
     var result = CallServer("/Signum/TrySave"); 
     if (result == true) { 
      document.forms[0].submit(); 
     } 
    } 

La variable "resultado" es siempre 'indefinido', y al depurarlo, puedo ver que se está ejecutando la línea "return true" de la función de devolución de llamada.

¿Alguna idea de por qué esto está sucediendo? ¿Cómo puedo burbuja el valor de retorno de la función de devolución de llamada a la función CallServer?

Gracias

Respuesta

0

Acabo de encontrar cómo hacerlo :) Declarar una variable y actualizarla en consecuencia desde la función de devolución de llamada. Después puedo devolver esa variable. Coloco el código para los futuros lectores:

function CallServer(urlController) { 
    var returnValue = false; 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic){ 
        returnValue = true; 
        return; 
       } 
      }, 
     error: 
      function(errorThrown) { 
       alert("Error occured: " + errorThrown); 
      } 
     }); 

     return returnValue; 
} 
+10

Aunque esto puede funcionar para usted, es un código impredecible, porque es probable que devuelva "returnValue" del CallServer antes de que el POST asincrónico establezca su valor. Regla general: no envuelva llamadas asincrónicas en envolturas síncronas. –

+0

es posible que tenga en cuenta $ .cuando hay una forma de esperar en las llamadas asincrónicas http://api.jquery.com/jQuery.when/ – Andbdrew

0

Yo suelo poner ningún código a ejecutar en caso de éxito dentro de la propia función de devolución de llamada. No creo que CallServer() realmente reciba los valores devueltos de las propias devoluciones de llamada.

Pruebe algo como:

function CallServer(urlController) { 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic) 
        document.forms[0].submit(); 
       else 
        // do something else 
      }, 
     error: 
      function(errorThrown) { 
       // handle error 
      } 
    }); 
} 

Editar: No estoy muy familiarizado con jQuery, por lo que podría estar completamente equivocado (estoy basando esto en el comportamiento de otros marcos, como YUI, y AJAX llamadas hechas sin ningún marco). Si es así, solo resta esta respuesta y deja un comentario, y borraré esta respuesta.

+0

No hay nada malo con la respuesta Calvin;) El problema es que es una función completamente genérica con fines de validación, por lo que no puedo poner el código allí como qué hacer si se aprueba la validación. Necesito de alguna manera hacer que Callserver devuelva el booleano. Saludos de todos modos – antonioh

15

En caso de que quiera seguir el camino asíncrono (que es una mejor solución, ya que no se congele el navegador mientras se hace la petición), aquí está el código:

+0

Mi función debe ser sincronizada, pero no conocía esa forma de devolver los valores que podría ser útil en algún momento, ¡así que gracias! – antonioh

Cuestiones relacionadas