2010-01-17 14 views
6

Ho una funzione javascript che richiede alcuni dati Ajax e recupera un oggetto JSON. Quindi dovrebbe restituire l'oggetto.Jquery: attendere la richiamata prima di restituire

Il problema è che non so come rendere la funzione restituita dal callback Ajax. Ovviamente

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

non funziona, perché la funzione interna sta ritornando anziché quella esterna.

D'altra parte l'esecuzione di ciò di cui ho bisogno appena all'interno del callback interromperà la suddivisione MVC: questo codice è in un modello e mi piacerebbe utilizzare l'oggetto risultato nel controller.

Una soluzione temporanea è

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

, che ha lo svantaggio di bloccare il browser durante l'attesa per la risposta (e usando eval, che preferirei evitare).

Esistono altre soluzioni?

+0

Questo è stato chiesto molte, molte volte ... Si veda ad esempio: http://stackoverflow.com/questions/31129/how-can-i-return-a-variable-from-a-getjson-function – Shog9

risposta

9

Si può solo passare un callback alla funzione, per elaborare i dati quando è pronto:

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

Questa è la soluzione più pulita finora. Vorrei usare come callback un metodo di controllo. Lo svantaggio è la necessità di rompere un metodo di controllo in due, ma suppongo che userò questa soluzione. – Andrea

1

perché vuoi che per restituire l'oggetto? Se si intende utilizzare questo oggetto dopo, un modo migliore sarebbe quello di inserire la funzione utilizzando i dati in il callback.

+0

L'ho detto nella domanda. La funzione stessa è in un modello e voglio usare l'oggetto in un controller. L'utilizzo dell'oggetto nel callback è fattibile, ma interrompe il pattern MVC. Forse lo farò se non trovo alternative migliori. – Andrea

Problemi correlati