2016-11-03 2 views
0
zurückgeben

Ich möchte JavaScript asynchron verwenden, wie es beabsichtigt war. Ich möchte die empfangenen Daten/Objekte so vielen Variablen zuweisen, wie benötigt werden (DataModel01, DataModel02, DataModel03 und so weiter). Die Idee ist, dass sich mein Bedarf an API-Daten ständig ändert, und ich möchte nur einmal festlegen, wo die Daten (API-Endpunkt) und in welcher lokalen Variable/Objekt es gespeichert werden soll.Warten auf AJAX-Aufruf in Funktion zu beenden, THEN Objekt zu einer externen Variablen

Die Art, wie ich es mache, gibt das Objekt mit empfangenen Daten von der fetchDataJSON() -Funktion zurück. Aber wie kann ich die Rückkehr warten, bis der Ajax fertig ist? Ich habe mehrere Dinge ausprobiert, einschließlich Timer und Callbacks, und überhaupt funktioniert nichts.

Ich sah die anderen Fragen in Bezug auf Ajax und Async, und im Allgemeinen wurde vorgeschlagen, Callbacks zu verwenden. Also glaube ich, dass ich nicht auf der Strecke bin, aber ich brauche eine Hand, um einen Weg zu finden, wie ich das anmutig behandeln kann. Muss ich wirklich mit Timern und hässlichen Lösungen herumspielen?

function fetchDataJSON(endpointUrl) { 
    var returnObj = []; 

    // Ajax call 
    $.ajax({ 
     type: "GET", 
     url: endpointUrl, 
     dataType: 'json', 
     async: true, 
     success: updateData, 
     error: handleError 
    }); 

    function updateData(data) { 
     returnObj = data; 
    } 

    function handleError(XHR, message, error) { 
     console.log("Failed XHR"); 
    } 

    return returnObj; // Return JSON object 
} 

var DataModel01 = fetchDataJSON("http://mydata.com/endpoint/sweetjson"); 
var DataModel02 = fetchDataJSON("http://mydata.com/endpoint/somethingelse"); 

EDIT: fand ich eine Arbeitslösung jetzt, yihar. Ich habe die Antwort von Karman als akzeptiert markiert, da sie der Lösung am nächsten war. Meine letzte Lösung, die auch von einem Mitarbeiter inspiriert wurde, ist wie folgt:

var DataModel01 = []; 
var DataModel02 = []; 

function fetchDataJSON(endpointUrl, callbackWhenDone) { 
    // Ajax call 
    $.ajax({ 
     type: "GET", 
     url: endpointUrl, 
     dataType: 'json', 
     async: true, 
     success: updateData, 
     error: handleError 
    }); 

    function updateData(data) { 
     callbackWhenDone(data); 
    } 

    function handleError(XHR, message, error) { 
     console.log("Failed XHR"); 
    } 
} 

fetchDataJSON(
    "http://mydata.com/endpoint/sweetjson", 
    function(newData) { DataModel01 = newData; } 
); 

fetchDataJSON(
    "http://mydata.com/endpoint/somethingelse", 
    function(newData) { DataModel02 = newData; } 
); 
+2

Mögliche Duplikat unterscheiden [Wie kehre ich die Antwort von einem asynchronen Aufruf?] (http://stackoverflow.com/questions/14220321/how-do- i-return-the-response-from-async-Aufruf) –

+0

Die Erfolgsfunktion wird nur aufgerufen, wenn die Anfrage erfolgreich ist, sie übergibt die zurückgegebenen Daten als Argument an die definierte Callback-Funktion. Ich denke, was du hast, sollte funktionieren. – Mark

Antwort

0
function fetchDataJSON(endpointUrl, callback) { 
function updateData(data) { 
    returnObj = data; 

    callback(returnObj) 
} 

fetchDataJSON("http://mydata.com/endpoint/sweetjson", getJson); 

enter code here 

function getJson(returnObj) 
{ 
    //do work with returnObj 
    } 
0

declare var DataModel1 in erster Linie des Codes.

in der Methode success (updateData) weisen Sie die Daten direkt DataModel1 zu. in Erfolg selbst Methode können Sie mit URL für datamodel2

Verwandte Themen