JQuery - хранение ответа ajax в глобальную переменную - PullRequest
64 голосов
/ 25 мая 2009

Я все еще новичок в 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');

Ответы [ 14 ]

67 голосов
/ 17 августа 2010

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

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");
34 голосов
/ 30 декабря 2011

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

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.

32 голосов
/ 25 мая 2009

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

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

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

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

8 голосов
/ 08 марта 2015

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

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

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

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

8 голосов
/ 17 мая 2011

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

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

6 голосов
/ 26 декабря 2014
        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');

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

3 голосов
/ 13 июля 2011
     function get(a){
            bodyContent = $.ajax({
                  url: "/rpc.php",
                  global: false,
                  type: "POST",
                  data: a,
                  dataType: "html",
                  async:false
               } 
            ).responseText;
            return bodyContent;

  }
2 голосов
/ 19 сентября 2012

Я действительно изо всех сил пытался получить результаты 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");
2 голосов
/ 23 августа 2012

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

$.ajax({  
    async: false, ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...