JQuery-Przechowywanie odpowiedzi ajax do zmiennej globalnej

Wciąż jestem trochę nowicjuszem w jQuery i AJAX, ale mam $.ajax request performing a GET to retrieve some XML files (~6KB or less), however for the duration the user spends on that XML content should / will not change (this design I cannot change, I also don ' t have access to change the XML file as I am reading it from where else). W związku z tym mam zmienną globalną, do której zapisuję DANE odpowiedzi, a każde kolejne szukanie danych odbywa się na tej zmiennej, więc wiele żądań nie musi być wykonane.

Biorąc pod uwagę fakt, że plik XML może się zwiększyć, Nie jestem pewien, czy jest to najlepsza praktyka, a także pochodząc z tła java moje myśli na temat globalnych zmiennych publicznych są ogólnie Nie-Nie.

Więc mam pytanie, czy może być lepszy sposób, aby to zrobić, i pytanie, czy powoduje to problemy z pamięcią, jeśli plik rozszerza się do jakiegoś śmiesznego rozmiaru pliku?

Myślę, że dane mogą być przekazywane do jakiejś funkcji typu getter/setter wewnątrz obiektu xml, która rozwiązałaby moje problemy z globalną zmienną publiczną, ale wciąż rodzi pytanie, Czy mam przechowywać odpowiedź wewnątrz samego obiektu.

Na przykład to, co obecnie robię, to:

// 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');
Author: Yukulélé, 2009-05-25

14 answers

Nie da się tego obejść poza przechowywaniem. Przywoływanie pamięci powinno zmniejszyć potencjalne problemy.

Sugerowałbym zamiast używać zmiennej globalnej o nazwie 'xml', zrobić coś więcej w ten sposób:

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;
    }};
})();

Następnie uzyskaj do niego dostęp za pomocą:

$(dataStore.getXml()).find('something').attr('somethingElse');
 30
Author: Luke Schafer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-01 00:26:22

Tutaj jest funkcja, która wykonuje zadanie całkiem dobrze. Nie mogłem uzyskać najlepszej odpowiedzi powyżej do pracy.

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

Następnie, aby uzyskać do niego dostęp, Utwórz zmienną w następujący sposób:

var results = $.getValues("url string");
 64
Author: Charles Guilbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-01 13:22:31

To mi pomogło:

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;

Ważna uwaga: global: false, async:false i na koniec responseText przykuta do $.ajax prośby.

 32
Author: Phil Lowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-18 20:20:16

Nie musisz tego robić. Napotkałem ten sam problem z moim projektem. to, co robisz, to wywołanie funkcji wewnątrz wywołania zwrotnego on success, aby zresetować zmienną globalną. Tak długo, jak masz asynchroniczny javascript ustawiony na false będzie działać poprawnie. Oto Mój kod. Mam nadzieję, że to pomoże.

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;
}
Mam nadzieję, że to ci pomoże .
 15
Author: Dom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-19 17:33:21

Twój problem może nie być związany z jakimkolwiek lokalnym lub globalnym zakresem, tylko opóźnieniem serwera między wykonaniem funkcji "success" a czasem, w którym próbujesz wyjąć dane ze zmiennej.

Są szanse, że próbujesz wydrukować zawartość zmiennej, zanim zostanie wywołana funkcja ajax "success".

 8
Author: vortex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-17 12:46:55

Może okazać się łatwiejsze przechowywanie wartości odpowiedzi w elemencie DOM, ponieważ są one dostępne globalnie:

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

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

Ta zaleta nie wymaga ustawiania async na false. Oczywiście, to, czy jest to właściwe, zależy od tego, co próbujesz osiągnąć.

 7
Author: afit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-08 17:02:40
        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');
To działa!!!
 5
Author: DarthVader,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-26 09:45:36
     function get(a){
            bodyContent = $.ajax({
                  url: "/rpc.php",
                  global: false,
                  type: "POST",
                  data: a,
                  dataType: "html",
                  async:false
               } 
            ).responseText;
            return bodyContent;

  }
 3
Author: Edmhs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-13 14:18:00

Naprawdę zmagałem się z uzyskaniem wyników jQuery ajax do moich zmiennych w " dokumencie.gotowy " etap wydarzeń.

Ajax JQuery ładowałby się do moich zmiennych, gdy użytkownik wyzwalał Zdarzenie" onchange " pola wyboru po załadowaniu strony, ale dane nie przekazywałyby zmiennych podczas pierwszego załadowania strony.

Próbowałem wielu, wielu, wielu różnych metod, ale ostatecznie to metoda Charlesa Guilberta zadziałała dla mnie najlepiej.

Czapki z głów Charles Guilbert Korzystając z jego odpowiedzi, jestem w stanie uzyskać dane do moich zmiennych, nawet gdy moja strona ładuje się po raz pierwszy.

Oto przykład działającego skryptu:

    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
Author: CityPickle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-19 17:22:14

Na to też wpadłem. Wiele odpowiedzi, ale tylko jedna prosta poprawna, którą zamierzam udzielić. Kluczem jest, aby twój $.połączenie ajax../ align = "left" /

$.ajax({  
    async: false, ...
 1
Author: stvn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-23 14:35:11

IMO możesz przechowywać te dane w zmiennej globalnej. Ale lepiej będzie użyć bardziej unikalnej nazwy lub użyć przestrzeni nazw:

MyCompany = {};

...
MyCompany.cachedData = data;

A także lepiej jest użyć json do tych celów, dane w formacie json są zwykle znacznie mniejsze niż te same dane w formacie xml.

 0
Author: zihotki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-25 04:35:03

Sugerowałbym, aby unikać pobierania dużych plików XML z serwera: zmienna " xml " powinna być używana jak cache, a nie jako sam magazyn danych.

W większości scenariuszy możliwe jest zbadanie pamięci podręcznej i sprawdzenie, czy trzeba złożyć żądanie do serwera, aby uzyskać dane, które chcesz. Dzięki temu aplikacja będzie lżejsza i szybsza.

Zdrówko, jrh.
 0
Author: jrharshath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-25 05:06:16

.odpowiedzi get są domyślnie buforowane. Dlatego naprawdę nie trzeba nic robić, aby uzyskać pożądane rezultaty.

 0
Author: redsquare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-25 05:06:52

Wiem, że wątek jest stary, ale pomyślałem, że komuś innemu może się to przydać. Według 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;

Pomogłoby uzyskać wynik bezpośrednio do ciągu znaków. Zwróć uwagę na .responseText; part.

 0
Author: user759740,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-18 20:54:40