jQuery - Сохранение ответа ajax в глобальную переменную

StackOverflow https://stackoverflow.com/questions/905298

  •  05-09-2019
  •  | 
  •  

Вопрос

Я все еще немного новичок в jQuery и ajax-сцене, но у меня есть запрос $ .ajax, выполняющий GET для извлечения некоторых XML-файлов (~ 6 КБ или меньше), однако в течение времени, которое пользователь проводит на этой странице, содержимое 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');
Это было полезно?

Решение

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

Я бы предложил вместо использования глобальной переменной с именем '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;
}

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

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

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

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

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

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

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

        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;

  }

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

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

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

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

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

MyCompany = {} Моя компания = {};

...
MyCompany.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;

помогло бы получить результат непосредственно в виде строки.Обратите внимание на .Текст ответа; часть.

Аналогично предыдущему ответу:

<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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top