2010-01-17 6 views
6

Ich habe eine JavaScript-Funktion, die nach einigen Ajax-Daten fragt und ein JSON-Objekt zurückbekommt. Dann sollte es das Objekt zurückgeben.Jquery: warte auf einen Rückruf vor der Rückgabe

Das Problem ist, dass ich nicht weiß, wie man die Funktion Rückkehr vom Ajax Callback. Natürlich

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

funktioniert nicht, weil die innere Funktion anstelle der äußeren zurückkehrt.

Auf der anderen Seite, die Ausführung von, was ich gerade innerhalb des Rückrufs brauche, wird meine MVC Unterteilung brechen: Dieser Code ist in einem Modell, und ich möchte das Ergebnisobjekt in der Steuerung verwenden.

Eine vorübergehende Lösung ist

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

die den Nachteil der Blockierung des Browser hat, während für die Antwort zu warten (und eval, die ich würde lieber vermeiden).

Gibt es noch andere Lösungen?

+0

Dies wurde viele, viele Male gefragt ... Siehe zum Beispiel: http://stackoverflow.com/questions/31129/how-can-i-return-a-variable-from-a-getjson-funktion – Shog9

Antwort

9

Sie könnten nur einen Rückruf an Ihre Funktion übergeben Sie die Daten zu verarbeiten, wenn es fertig ist:

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

Dies ist bisher die sauberste Lösung. Ich würde als Callback eine Controller-Methode verwenden. Der Nachteil ist die Notwendigkeit, eine Controller-Methode in zwei zu brechen, aber ich denke, ich werde diese Lösung verwenden. – Andrea

1

Warum wollen Sie es das Objekt zurück? Wenn Sie dieses Objekt später verwenden möchten, wäre ein besserer Weg, die Funktion unter Verwendung der Daten in den Rückruf zu setzen.

+0

Ich sagte das in der Frage. Die Funktion selbst ist in einem Modell und ich möchte das Objekt in einem Controller verwenden. Die Verwendung des Objekts im Rückruf ist möglich, bricht jedoch das MVC-Muster. Vielleicht werde ich das tun, wenn ich keine besseren Alternativen finde. – Andrea