2010-01-17 33 views
6

Tengo una función de javascript que solicita algunos datos ajax y recupera un objeto JSON. Entonces debería devolver el objeto.Jquery: esperar la devolución de llamada antes de devolver

El problema es que no sé cómo hacer que la función vuelva de la devolución de llamada Ajax. Por supuesto

myFunction: function() { 
    $.get(myUrl, function(data) { 
     return data; 
    }); 
} 

no funciona, porque la función interna está regresando en lugar de la externa.

Por otro lado, la ejecución de lo que necesito dentro de la devolución de llamada romperá mi subdivisión MVC: este código está en un modelo, y me gustaría utilizar el objeto resultante en el controlador.

Una solución temporal es

myFunction: function() { 
    var result = $.ajax({ 
     url: myUrl, 
     async: true, 
     dataType: 'text' 
    }).responseText; 
    return eval(result); 
} 

que tiene la desventaja de bloquear el navegador a la espera de la respuesta (y el uso de eval, que prefiero evitar).

¿Hay alguna otra solución?

+0

Esto se ha preguntado muchas, muchas veces ... Ver por ejemplo: http://stackoverflow.com/questions/31129/how-can-i-return-a-variable-from-a-getjson-function – Shog9

Respuesta

9

Se podía pasar una devolución de llamada a la función, para procesar los datos cuando está listo:

myFunction: function(callback) { 
    $.get(myUrl, function(data) { 
     callback(data); 
    }); 
} 
+0

Esta es la solución más limpia hasta ahora. Yo usaría como devolución de llamada un método de controlador. El inconveniente es la necesidad de dividir un método de controlador en dos, pero supongo que usaré esta solución. – Andrea

1

¿Por qué quiere que vuelva el objeto? Si tiene la intención de utilizar este objeto después, una forma mejor sería poner la función usando los datos en la devolución de llamada.

+0

Lo dije en la pregunta. La función en sí está en un modelo, y quiero usar el objeto en un controlador. El uso del objeto en la devolución de llamada es factible, pero rompe el patrón MVC. Tal vez lo haga si no encuentro mejores alternativas. – Andrea

Cuestiones relacionadas