Frage JQuery - Speichern von Ajax-Antworten in globalen Variablen


Ich bin immer noch ein Neuling in jQuery und der Ajax-Szene, aber ich habe eine $ .ajax-Anfrage, die einen GET durchführt, um einige XML-Dateien abzurufen (~ 6KB oder weniger), jedoch für die Dauer, die der Benutzer auf dieser Seite verbringt nicht / wird nicht geändert (dieses Design kann ich nicht ändern, ich habe auch keinen Zugriff auf die XML-Datei zu ändern, da ich es von woanders lese). Daher habe ich eine globale Variable, in der ich die Antwortdaten speichern kann, und alle nachfolgenden Nachschlagevorgänge für die Daten werden für diese Variable durchgeführt, so dass keine Mehrfachanfragen gestellt werden müssen.

Angesichts der Tatsache, dass die XML-Datei erhöhen kann, bin ich nicht sicher, dass dies die beste Praxis ist, und auch aus einem Java-Hintergrund meine Gedanken zu globalen öffentlichen Variablen sind in der Regel ein No-No.

Also die Frage, die ich habe, ist, ob es eine bessere Möglichkeit gibt, dies zu tun, und eine Frage, ob dies Speicherprobleme verursacht, wenn die Datei zu einer lächerlichen Dateigröße erweitert wird?

Ich denke, die Daten könnten in einige Getter / Setter-Funktionen innerhalb des XML-Objekts übergeben werden, was meine Probleme mit globalen öffentlichen Variablen lösen würde, aber immer noch die Frage aufwirft, ob ich die Antwort im Objekt selbst speichern soll.

Zum Beispiel, was ich derzeit mache ist:

// top of code
var xml;
// get the file
$.ajax({
  type: "GET",
  url: "test.xml",
  dataType: "xml",
  success : function(data) {
    xml = data;
  }
});
// at a later stage do something with the 'xml' object
var foo = $(xml).find('something').attr('somethingElse');

59
2018-05-25 04:18


Ursprung


Antworten:


Es gibt keinen anderen Weg, als es zu speichern. Memory Paging sollte mögliche Probleme dort reduzieren.

Ich würde vorschlagen, statt eine globale Variable namens 'xml', etwas mehr wie folgt zu tun:

var dataStore = (function(){
    var xml;

    $.ajax({
      type: "GET",
      url: "test.xml",
      dataType: "xml",
      success : function(data) {
                    xml = data;
                }
    });

    return {getXml : function()
    {
        if (xml) return xml;
        // else show some error that it isn't loaded yet;
    }};
})();

dann greifen Sie darauf zu:

$(dataStore.getXml()).find('something').attr('somethingElse');

30
2018-05-25 04:35



Hier ist eine Funktion, die den Job recht gut macht. Ich konnte die beste Antwort oben nicht zur Arbeit bringen.

jQuery.extend({
    getValues: function(url) {
        var result = null;
        $.ajax({
            url: url,
            type: 'get',
            dataType: 'xml',
            async: false,
            success: function(data) {
                result = data;
            }
        });
       return result;
    }
});

Um darauf zuzugreifen, erstellen Sie die Variable wie folgt:

var results = $.getValues("url string");

63
2017-08-17 15:17



Das hat für mich funktioniert:

var jqxhr = $.ajax({
    type: 'POST',       
    url: "processMe.php",
    data: queryParams,
    dataType: 'html',
    context: document.body,
    global: false,
    async:false,
    success: function(data) {
        return data;
    }
}).responseText;

alert(jqxhr);
// or...
return jqxhr;

Wichtig zu beachten: global: false, async:false und schlussendlich responseText angekettet an die $.ajax anfordern.


32
2017-12-30 13:40



Du musst nichts davon tun. Ich stieß auf das gleiche Problem mit meinem Projekt. Was Sie tun, ist einen Funktionsaufruf innerhalb des On-Success-Callbacks, um die globale Variable zurückzusetzen. Solange asynchrones Javascript auf false gesetzt ist, funktioniert es korrekt. Hier ist mein Code. Ich hoffe es hilft.

var exists;

//function to call inside ajax callback 
function set_exists(x){
    exists = x;
}

$.ajax({
    url: "check_entity_name.php",
    type: "POST",
    async: false, // set to false so order of operations is correct
    data: {entity_name : entity},
    success: function(data){
        if(data == true){
            set_exists(true);
        }
        else{
            set_exists(false);
        }
    }
});
if(exists == true){
    return true;
}
else{
    return false;
}

Hoffe das hilft dir.


15
2018-01-19 17:33



Ihr Problem hängt möglicherweise nicht mit einem lokalen oder globalen Bereich zusammen, sondern nur mit der Serververzögerung zwischen der ausgeführten Funktion "success" und der Zeit, zu der Sie versuchen, Daten aus Ihrer Variablen zu entfernen.

Wahrscheinlich versuchen Sie, den Inhalt der Variablen zu drucken, bevor die Ajax-Funktion "success" ausgelöst wird.


8
2018-05-17 12:46



Es kann einfacher sein, die Antwortwerte in einem DOM-Element zu speichern, da sie global zugänglich sind:

<input type="hidden" id="your-hidden-control" value="replace-me" />

<script>
    $.getJSON( '/uri/', function( data ) {
        $('#your-hidden-control').val( data );
    } );
</script>

Dies hat den Vorteil, dass async nicht auf false gesetzt werden muss. Ob dies angemessen ist, hängt eindeutig davon ab, was Sie erreichen möchten.


7
2018-03-08 17:02



        function getJson(url) {
            return JSON.parse($.ajax({
                type: 'GET',
                url: url,
                dataType: 'json',
                global: false,
                async: false,
                success: function (data) {
                    return data;
                }
            }).responseText);
        }

        var myJsonObj = getJson('/api/current');

Das funktioniert!!!


5
2017-12-26 09:45



     function get(a){
            bodyContent = $.ajax({
                  url: "/rpc.php",
                  global: false,
                  type: "POST",
                  data: a,
                  dataType: "html",
                  async:false
               } 
            ).responseText;
            return bodyContent;

  }

3
2017-07-13 14:18



Ich hatte wirklich Schwierigkeiten, die Ergebnisse von jQuery ajax in meine Variablen auf der "document.ready" -Ereignisstufe zu bringen.

jQuerys Ajax würde in meine Variablen geladen werden, wenn ein Benutzer ein "onchange" -Ereignis eines Auswahlfelds nach dem Laden der Seite auslöst, aber die Daten würden die Variablen nicht liefern, wenn die Seite zum ersten Mal geladen wurde.

Ich habe viele, viele, viele verschiedene Methoden ausprobiert, aber am Ende war es Charles Guilberts Methode, die am besten für mich funktionierte.

Hut ab vor Charles Guilbert! Mit seiner Antwort kann ich Daten in meine Variablen importieren, selbst wenn meine Seite zuerst geladen wird.

Hier ist ein Beispiel für das Arbeitsskript:

    jQuery.extend
    (
        {
            getValues: function(url) 
            {
                var result = null;
                $.ajax(
                    {
                        url: url,
                        type: 'get',
                        dataType: 'html',
                        async: false,
                        cache: false,
                        success: function(data) 
                        {
                            result = data;
                        }
                    }
                );
               return result;
            }
        }
    );

    // Option List 1, when "Cats" is selected elsewhere
    optList1_Cats += $.getValues("/MyData.aspx?iListNum=1&sVal=cats");

    // Option List 1, when "Dogs" is selected elsewhere
    optList1_Dogs += $.getValues("/MyData.aspx?iListNum=1&sVal=dogs");

    // Option List 2, when "Cats" is selected elsewhere
    optList2_Cats += $.getValues("/MyData.aspx?iListNum=2&sVal=cats");

    // Option List 2, when "Dogs" is selected elsewhere
    optList2_Dogs += $.getValues("/MyData.aspx?iListNum=2&sVal=dogs");

2
2017-09-19 17:22



Kam auch dazu. Viele Antworten, aber nur eine einfache, korrekte, die ich anbieten werde. Der Schlüssel ist, um Ihren $ .ajax Call..sync zu machen!

$.ajax({  
    async: false, ...

1
2017-08-23 14:35