3 Stimmen

Abrufen von Daten aus der Methode $.getJSON()

Ich schreibe eine Webanwendung und muss einige Parameter initialisieren, die ich über die Methode $.getJSON() abrufe.

$.getJSON("../config/", function(data)
{
     console.debug(data);
}

Nun, da diese Werte global im gesamten Skript verwendet werden und nicht ein Ereignis direkt auslösen werden (was die einzige Implementierung von $.getJSON() ist, die ich in der Dokumentation finden konnte), wie kann ich diese Callback-Daten zurückgeben oder abrufen?

1 Stimmen

Ich verstehe Ihr Problem hier nicht, $.getJSON 2. Argument ist eine Callback-Funktion, die aufgerufen wird, sobald die Anforderung abgeschlossen und erfolgreich ist.

0 Stimmen

Was wollen Sie mit den Daten von getJSON machen?

17voto

Kent Fredric Punkte 55042

Am besten halten Sie sich an die Rückruftechnik.

Es gibt 2 echte Möglichkeiten, beide sind im Wesentlichen gleich.

$.getJSON("../config/", function(data) {
        SomeObject.config = data; 
        SomeObject.load();   # assuming load tells some-object that it now has data and to get cracking
});

o

$.getJSON("../config/", function(data) {
        SomeObject.load( data );   # SomeObject sets itself up and starts doing its thing
});

Der Versuch, $.getJSON auf synchrone Weise zu verwenden (d.h. einen Wert zurückzugeben), wird nur in Tränen und Elend für Sie beide enden und die Nutzer Ihrer Website, da synchrone Verbindungen dazu neigen, die gesamte Benutzeroberfläche zu blockieren :)

So wie es aussieht, kann man so etwas asynchron machen

var i = null;                              #1
$.getJSON("../config/", function(data) {   #2
        i = data;                          #3
});                                        #4
some_function_with(i);                     #5

Wird nicht funktionieren, weil Zeile 5 fast garantiert vor Zeile 3 ausgeführt wird.

0 Stimmen

Unter Berücksichtigung aller Vorbehalte in Bezug auf synchrone Anfragen müssen Sie, falls Sie es wirklich auf diese Weise tun müssen, die "niedrigere Ebene" $.ajax({ ... , dataType: "json", async: false )} verwenden. Im obigen Beispiel wird dadurch die Ausführung von #3 vor #5 garantiert.

3voto

KeyboardInterrupt Punkte 3093

Kent Fredric: Ich bin mir nicht sicher, ob Ihr Ansatz besser ist. Wenn Ihre Methode besser ist, lassen Sie es mich wissen, und ich werde Ihre Lösung meiner eigenen vorziehen, aber so habe ich es gemacht:

 var my_data = null;

$.ajax(
{
    url: "../config/",
    dataType: "json",
    async: false,
    success: function(data)
    {
        my_data = data;
    }
});

Auch danke RichieHindle, ich wusste nicht, dass es möglich war, Variablen außerhalb von Funktionen ohne Rückgabe zu ersetzen.

0 Stimmen

Synchrone Anfragen blockieren den Browser, so dass im Falle einer Server-Zeitüberschreitung der Browser hängen bleiben kann, ... auf unbestimmte Zeit. Während synchrone Anfragen stattfinden, reagiert die Seite nicht auf Benutzereingaben.

0 Stimmen

@Kent: Sie blockieren meinen Browser nicht. Es gibt keinen Unterschied zwischen einer synchronen Anfrage und einem normalen, standardmäßigen Seitenaufbau; wenn die Daten, die Sie über AJAX abrufen, kritisch sind, sehe ich überhaupt keinen Grund, synchrone Anfragen zu vermeiden - Sie werden wahrscheinlich nicht wollen der Benutzer, der in dieser Zeit Eingaben macht, sowieso!

0 Stimmen

Ich nehme es einfach mit gerade aus der Dokumentation: "Beachten Sie, dass synchrone Anfragen den Browser vorübergehend sperren können, so dass keine Aktionen möglich sind, solange die Anfrage aktiv ist." api.jquery.com/jQuery.ajax Und ja, es gibt einen Unterschied, eine Sync-Anfrage funktioniert wie ein Inline-<script> + document.write-Aufruf, wobei das, was danach kommt, erst verwendet werden kann, wenn das Skript beendet ist. (D.h.: das Rendering des Dokuments und die Ausführung des Skripts sind ebenfalls synchron) Und wenn man innerhalb eines <script>-Tags unendlich lange blockiert, neigt die Benutzeroberfläche dazu, nicht allzu gut zu reagieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X