JQuery - 将ajax响应存储到全局变量中

66 xml ajax jquery response

我仍然是jQuery和ajax场景的新手,但我有一个$ .ajax请求执行GET来检索一些XML文件(大约6KB或更少),但是在用户花费在该页面上的持续时间内,XML内容应该是不会/不会改变(这个设计我无法改变,我也无权更改XML文件,因为我正在从其他地方读取它).因此,我有一个全局变量,我将响应数据存储到其中,并且对此数据的任何后续查找都在此变量上完成,因此不需要进行多个请求.

鉴于XML文件可以增加的事实,我不确定这是最佳实践,并且也来自java背景我对全局公共变量的想法通常是禁止的.

所以我的问题是,是否有更好的方法可以做到这一点,以及一个问题,如果文件扩展到一些荒谬的文件大小,这是否会导致任何内存问题?

我认为数据可以传递到xml对象中的一些getter/setter类型函数,这将解决我的全局公共变量问题,但仍然提出了我是否应该将响应存储在对象本身内的问题.

例如,我目前所做的是:

// 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');
Run Code Online (Sandbox Code Playgroud)

小智 68

这是一个很好地完成工作的功能.我无法得到上面的最佳答案.

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

然后要访问它,像这样创建变量:

var results = $.getValues("url string");
Run Code Online (Sandbox Code Playgroud)

  • 并可以创建很多问题,如冻结浏览器几秒钟:) (6认同)
  • 这个在chrome控制台中发出警告,例如主线程上的同步XMLHttpRequest因其对最终用户体验的不利影响而被弃用.如需更多帮助,请查看http:// xhr.spec.whatwg.org/.` (4认同)
  • 实际上只是添加'async:false'可以解决你将遇到的很多问题. (3认同)
  • 这不行. (2认同)

小智 35

这对我有用:

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;
Run Code Online (Sandbox Code Playgroud)

重要的是要注意:global: false,async:false最后responseText链接到$.ajax请求.

  • async:false会造成破坏!如果您有一个带有加载gif或其他内容的beforeSend,异步将使其非常难看 (2认同)

Luk*_*fer 34

除了存储它之外没有办法解决它.内存分页应该减少那里的潜在问题.

我建议不要使用名为'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;
    }};
})();
Run Code Online (Sandbox Code Playgroud)

然后访问它:

$(dataStore.getXml()).find('something').attr('somethingElse');
Run Code Online (Sandbox Code Playgroud)

  • > [警报]此答案不起作用.请阅读下面的`rfc1484`的答案. (9认同)

Dom*_*Dom 17

你不必做任何这些.我的项目遇到了同样的问题.你要做的是在on success 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;
}
Run Code Online (Sandbox Code Playgroud)

希望这对你有所帮助.


Aid*_*ick 9

您可能会发现将响应值存储在DOM元素中更容易,因为它们可以全局访问:

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

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

这样做的好处是不需要将async设置为false.显然,这是否合适取决于你想要实现的目标.

  • 很简单!它对我有用,尽管不是使用设置输入值的方法,而是使用jQuery的.data()方法存储JSON。 (2认同)

vor*_*tex 8

您的问题可能与任何本地或全局范围无关,只是服务器在执行"成功"函数与尝试从变量中取出数据的时间之间出现延迟.

你有可能在ajax"success"函数触发之前尝试打印变量的内容.


Dar*_*der 6

        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');
Run Code Online (Sandbox Code Playgroud)

这个工作!!!