web-dev-qa-db-de.com

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-Anforderung, die ein GET ausführt, um einige XML-Dateien (~ 6 KB oder weniger) abzurufen, jedoch für die Dauer, die der Benutzer auf dieser Seite verbringt, der XML-Inhalt nicht/wird sich nicht ändern (dieses Design kann ich nicht ändern, ich habe auch keinen Zugriff auf die XML-Datei, da ich sie an anderer Stelle lese). Daher habe ich eine globale Variable, in der ich die Antwortdaten speichere, und alle nachfolgenden Abfragen der Daten werden für diese Variable durchgeführt, so dass nicht mehrere Anforderungen gestellt werden müssen.

In Anbetracht der Tatsache, dass die XML-Datei zunehmen kann, bin ich nicht sicher, ob dies die bewährte Methode ist, und auch aus einem Java-Hintergrund kommend sind meine Gedanken zu globalen öffentlichen Variablen im Allgemeinen ein Nein.

Die Frage, die ich habe, ist also, ob es einen besseren Weg gibt, dies zu tun, und eine Frage, ob dies zu Speicherproblemen führt, wenn sich die Datei auf eine lächerliche Dateigröße ausdehnt.

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

Was ich zum Beispiel mache, ist zum Beispiel:

// 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');
62
Dom

Es gibt keine andere Möglichkeit, als es zu speichern. Speicher-Paging sollte potenzielle Probleme dort reduzieren.

Anstelle einer globalen Variablen namens 'xml' würde ich Folgendes vorschlagen:

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 mit:

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

Hier ist eine Funktion, die den Job ganz gut macht. Ich konnte nicht die beste Antwort oben erhalten, um zu arbeiten.

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");
66

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 schließlich responseText an die $.ajax-Anforderung gekettet. 

33
Phil Lowe

Sie müssen nichts davon tun. Ich bin mit meinem Projekt auf das gleiche Problem gestoßen. Sie führen einen Funktionsaufruf im on success-Callback aus, um die globale Variable zurückzusetzen. Solange Sie asynchrones Javascript auf false gesetzt haben, wird es korrekt funktionieren. 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.

16
Dom

ihr Problem hängt möglicherweise nicht mit einem lokalen oder globalen Bereich zusammen, sondern lediglich mit der Serververzögerung zwischen der Ausführung der Funktion "success" und dem Zeitpunkt, zu dem Sie versuchen, Daten aus Ihrer Variablen zu entfernen.

wahrscheinlich versuchen Sie, den Inhalt der Variablen auszudrucken, bevor die Ajax-Funktion "Erfolg" ausgelöst wird.

8
vortex

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 natürlich davon ab, was Sie erreichen wollen.

7
afit
        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
DarthVader
     function get(a){
            bodyContent = $.ajax({
                  url: "/rpc.php",
                  global: false,
                  type: "POST",
                  data: a,
                  dataType: "html",
                  async:false
               } 
            ).responseText;
            return bodyContent;

  }
3
Edmhs

Ich hatte wirklich Probleme damit, die Ergebnisse von jQuery ajax in der Variablen "document.ready" der Ereignisse in meine Variablen zu bekommen. 

der ajax von jQuery würde in meine Variablen geladen, wenn ein Benutzer ein "onchange" -Ereignis eines Auswahlfelds auslöste, nachdem die Seite bereits geladen war. Die Daten fuhren die Variablen jedoch nicht, wenn die Seite zum ersten Mal geladen wurde. 

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

Hut ab vor Charles Guilbert! Durch seine Antwort kann ich Daten in meine Variablen einlesen, auch wenn meine Seite zum ersten Mal 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
CityPickle

Ich bin auch in diese Sache gegangen. Viele Antworten, aber nur eine einfache richtige, die ich liefern werde. Der Schlüssel ist, um Ihren $ .ajax-Aufruf..sync zu machen!

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

Ähnlich wie bei der vorherigen Antwort:

<script type="text/javascript">

    var wait = false;

    $(function(){
        console.log('Loaded...');
        loadPost(5);
    });

    $(window).scroll(function(){
      if($(window).scrollTop() >= $(document).height() - $(window).height()-100){
        // Get last item
        var last = $('.post_id:last-of-type').val();
        loadPost(1,last);
      }
    });

    function loadPost(qty,offset){
      if(wait !== true){

        wait = true;

        var data = {
          items:qty,
          oset:offset
        }

        $.ajax({
            url:"api.php",
            type:"POST",
            dataType:"json",
            data:data,
            success:function(data){
              //var d = JSON.parse(data);
              console.log(data);
              $.each(data.content, function(index, value){
                $('#content').append('<input class="post_id" type="hidden" value="'+value.id+'">')
                $('#content').append('<h2>'+value.id+'</h2>');
                $('#content').append(value.content+'<hr>');
                $('#content').append('<h3>'+value.date+'</h3>');
              });
              wait = false;
            }
        });
      }
    }
</script>
0
Kyle Coots

Ich weiß, dass der Thread alt ist, aber ich dachte, jemand anderes könnte das nützlich finden. Laut jquey.com

var bodyContent = $.ajax({
  url: "script.php",
  global: false,
  type: "POST",
  data: "name=value",
  dataType: "html",
  async:false,
  success: function(msg){
     alert(msg);
  }
}).responseText;

würde helfen, das Ergebnis direkt in einen String zu bekommen ..__ Beachten Sie den .responseText; Teil.

0
user759740

IMO können Sie diese Daten in einer globalen Variablen speichern. Es ist jedoch besser, einen eindeutigeren Namen oder einen Namensraum zu verwenden:

MyCompany = {};

...
MyCompany.cachedData = data;

Außerdem ist es besser, json für diese Zwecke zu verwenden. Daten im Json-Format sind normalerweise viel kleiner als dieselben Daten im XML-Format.

0
zihotki

Ich würde vorschlagen, dass das Abrufen großer XML-Dateien vom Server vermieden werden sollte: Die Variable "xml" sollte als cache und nicht als Datenspeicher selbst verwendet werden.

In den meisten Szenarien ist es möglich, den Cache zu überprüfen und festzustellen, ob Sie eine Anforderung an den Server stellen müssen, um die gewünschten Daten abzurufen. Dadurch wird Ihre App leichter und schneller.

prost, jrh.

0
jrharshath

Get-Antworten werden standardmäßig zwischengespeichert. Daher müssen Sie wirklich nichts tun, um die gewünschten Ergebnisse zu erzielen.

0
redsquare