Подтвердить что ты не робот

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

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

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

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

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

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

// 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');
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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.

Ответ 4

Вам не нужно ничего делать. Я столкнулся с той же проблемой с моим проектом. то, что вы делаете, это вызвать вызов функции внутри обратного вызова при успешном завершении до reset глобальной переменной. До тех пор, пока вы установите асинхронный 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;
}

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

Ответ 5

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

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

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

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

Ответ 6

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

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

Ответ 7

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

Это работает!!!

Ответ 8

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

  }

Ответ 9

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

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

Ответ 10

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

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

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

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

Здесь приведен пример рабочего script:

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

Ответ 11

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

MyCompany = {};

...
MyCompany.cachedData = data;

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

Ответ 12

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

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

cheers, jrh.

Ответ 13

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

Ответ 14

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

Ответ 15

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

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