JQuery-хранение ответа ajax в глобальной переменной


Я все еще немного новичок в jQuery и сцене ajax, но у меня есть $.ajax-запрос, выполняющий GET для получения некоторых XML-файлов (~6KB или меньше), однако в течение времени, которое пользователь тратит на эту страницу, содержимое XML не должно / не изменится (этот дизайн я не могу изменить, у меня также нет доступа к изменению XML-файла, поскольку я читаю его откуда-то еще). Поэтому у меня есть глобальная переменная, в которую я храню данные ответа, и любые последующие поиски данных сделано на этой переменной, поэтому несколько запросов не нужно делать.

учитывая тот факт, что XML-файл может увеличиваться, я не уверен, что это лучшая практика, а также исходя из фона java мои мысли о глобальных публичных переменных, как правило, нет-нет.

Итак, у меня есть вопрос, Может ли быть лучший способ сделать это, и вопрос о том, вызывает ли это какие-либо проблемы с памятью, если файл расширяется до какого-то смешного размера файла?

Я рис. данные могут быть переданы в некоторые функции типа getter / setter внутри объекта xml, что решит мои проблемы с глобальными общедоступными переменными, но все же поднимает вопрос о том, следует ли хранить ответ внутри самого объекта.

например, то, что я сейчас делаю:

// 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');
14 59

14 ответов:

нет никакого пути обойти это, кроме как хранить его. Подкачка памяти должна уменьшить потенциальные проблемы там.

Я бы предложил вместо использования глобальной переменной под названием 'xml', сделать что-то вроде этого:

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

затем получить к нему доступ с помощью:

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

вот функция, которая делает эту работу довольно хорошо. Я не мог получить лучший ответ выше, чтобы работать.

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

затем, чтобы получить к нему доступ, создайте переменную следующим образом:

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

это сработало для меня:

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;

важно: global: false,async:false и наконец responseText прикован к $.ajax запрос.

вы не должны делать ничего из этого. Я столкнулся с той же проблемой с моим проектом. то, что вы делаете, - это вызов функции внутри обратного вызова on success для сброса глобальной переменной. Пока вы установили асинхронный javascript в false, он будет работать правильно. Вот мой код. Надеюсь, это поможет.

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

надеюсь, что это поможет вам .

ваша проблема может быть не связана с какой-либо локальной или глобальной областью, если на то пошло, просто задержка сервера между выполнением функции "успех" и временем, когда вы пытаетесь извлечь данные из своей переменной.

скорее всего, вы пытаетесь распечатать содержимое переменной до срабатывания функции ajax "success".

возможно, Вам будет проще хранить значения ответа в элементе DOM, поскольку они доступны глобально:

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

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

это имеет то преимущество, что не нужно устанавливать async в false. Очевидно, что это уместно зависит от того, чего вы пытаетесь достичь.

        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');

это работает!!!

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

  }

Я действительно боролся с получением результатов jQuery ajax в мои переменные в " документе.готовый " этап мероприятий.

ajax jQuery загружается в мои переменные, когда пользователь запускает событие "onchange" в поле выбора после того, как страница уже загружена, но данные не будут подавать переменные при первой загрузке страницы.

снимаю шляпу перед Чарльзом Гильбертом! Используя его ответ, я могу получить данные в свои переменные, даже когда моя страница загружается впервые.

вот пример работы скрипта:

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

тоже столкнулся с этим. Много ответов, но только один простой правильный, который я собираюсь предоставить. Ключ в том, чтобы сделать ваш $.AJAX-вызов..синхронизация!

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

IMO вы можете хранить эти данные в глобальной переменной. Но лучше будет использовать какое-то более уникальное имя или использовать пространство имен:

Название_компании = {};

...
Название_компании.cachedData = данные;

а также лучше использовать json для этих целей, данные в формате json обычно намного меньше, чем те же данные в формате xml.

Я бы предложил избегать извлечения больших XML-файлов с сервера: переменная " xml " должна использоваться как кэш, а не как само хранилище данных.

в большинстве сценариев можно проверить кэш и посмотреть, нужно ли сделать запрос на сервер, чтобы получить данные, которые вы хотите. Это сделает ваше приложение легче и быстрее.

ура, экспертную.

.получить ответы кэшируются по умолчанию. Поэтому вам действительно ничего не нужно делать, чтобы получить желаемые результаты.

Я знаю, что нить старое, но я думал, что кто-то может найти это полезным. По данным 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;

позволит получить результат в строку напрямую. Обратите внимание на .responseText; часть.