2010-02-01 10 views
45

Ich muss etwas sehr einfaches tun, aber es scheint nicht ein einfacher Weg, dies zu tun, soweit ich das beurteilen kann. Ich möchte nur JSON-Daten von einer Remote-Quelle laden und in einer globalen Javascript-Variable mit jQuery speichern. Folgendes habe ich:lade json in Variable

var my_json; 
$.getJSON(my_url, function(json) { 
    var my_json = json; 
}); 

Die Variable my_json bleibt undefiniert. Ich denke, das ist eindeutig ein Problembereich. Es scheint mir, dass die $ .getJSON-Methode JSON zurückgeben sollte, aber sie gibt ein XMLHttpRequest-Objekt zurück. Wenn ich dies tun:

request = $.getJSON(my_url); 
my_json = request.responseText.evalJSON(); 

Das ist nicht, weil nicht funktioniert, bis die Readystate == 4 bleibt die response null. Es scheint, dass Sie die Callback-Funktion verwenden müssen, um den responsetext zurückzugeben, da er bei Erfolg ausgelöst wird.

Es kann nicht so schwer sein! Recht?

Antwort

115

Dies wird es tun:

var json = (function() { 
    var json = null; 
    $.ajax({ 
     'async': false, 
     'global': false, 
     'url': my_url, 
     'dataType': "json", 
     'success': function (data) { 
      json = data; 
     } 
    }); 
    return json; 
})(); 

Das Hauptproblem ist, dass $.getJSON asynchron ausgeführt werden, so dass Ihre Javascript wird hinter dem Ausdruck Fortschritte, die sie ruft auch bevor der Rückruf success ausgelöst wird, gibt es keine Garantie dafür, dass Ihre Variable Daten erfasst.

Beachten Sie insbesondere die Option 'async': false im obigen Ajax-Aufruf. Die manual sagt:

Standardmäßig werden alle Anfragen asynchron gesendet (das heißt diese Option auf true standardmäßig eingestellt ist). Wenn Sie synchrone Anforderungen benötigen, setzen Sie diese Option auf false. Beachten Sie, dass synchrone Anfragen den Browser temporär sperren können, deaktiviert alle Aktionen, während die Anfrage aktiv ist.

+0

nur um zu meinem Vorteil zu klären: $ .getJSON ist nie eine gute Option für synchrone Stil Anforderungen, auch wenn ich Daten an meine Variable während des Erfolgs Callback zurückgeben? – user1026169

+0

+1 für verwandte Informationen, aber warum machen Sie JSON Variable Null beim Start der Funktion. – Manoj

+0

@Manoj Es gibt 2 Gründe [1] dieser Block kann innerhalb einer Methode sein und mehrfach aufgerufen werden. Daher würde dies die Json-Variable aktualisieren. Aber wenn die Ajax-Anfrage das sowieso aktualisieren wird, was ist der Punkt? Nun, das ist, weil ... [2] Dies ist eine Kodierungskonvention, falls die Ajax-Anfrage fehlschlägt, dann kann der Benutzer testen, ob Json null ist. Wenn dies der Fall ist, kann davon ausgegangen werden, dass die Ajax-Anforderung fehlgeschlagen ist. –

25

Codebit sollte lauten:

var my_json; 
$.getJSON(my_url, function(json) { 
    my_json = json; 
}); 
+5

+1 verwenden Sie nicht 'var' zweimal –

+3

, wie dies die asynchrone Ausgabe oben erwähnt nicht vermeiden? – user1026169

+1

Wahrscheinlich ist es eine schlechte Idee, synchrone Ajax-Aufrufe zu erzwingen. Ajax war für asynchrone Aufrufe gedacht. Diese Antwort sollte eine gewünschte Lösung für ein Problem in Frage gestellt werden, +1 von mir. – Buyuk

0
<input class="pull-right" id="currSpecID" name="currSpecID" value=""> 

    $.get("http://localhost:8080/HIS_API/rest/MriSpecimen/getMaxSpecimenID", function(data, status){ 
     alert("Data: " + data + "\nStatus: " + status); 
    $("#currSpecID").val(data); 
    }); 

enter image description here enter image description here

0

var itens = null; 
 
$.getJSON("yourfile.json", function(data) { 
 
    itens = data; 
 
    itens.forEach(function(item) { 
 
    console.log(item); 
 
    }); 
 
}); 
 
console.log(itens);
<html> 
 
<head> 
 
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script> 
 
</head> 
 
<body> 
 
</body> 
 
</html>

+2

Willkommen beim Stack-Overflow :-) Code-only-Antworten sind nicht nützlich für die Community. Bitte erläutern Sie, warum Ihr Code das Problem löst. Siehe [Antwort] – JimHawkins

Verwandte Themen