【问题标题】:JQuery - Storing ajax response into global variableJQuery - 将ajax响应存储到全局变量中
【发布时间】:2009-05-25 04:18:14
【问题描述】:

我仍然是 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');

【问题讨论】:

  • 警告无畏的探险家。以下许多解决方案使用 async:false。这里是龙

标签: jquery xml ajax response


【解决方案1】:

这是一个可以很好地完成工作的函数。我无法获得上述最佳答案。

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

【讨论】:

  • 其实只要加上 'async : false' 就可以解决很多你会遇到的问题。
  • 并且会产生很多问题,例如冻结浏览器几秒钟:)
  • 异步导致了很多问题。什么可以解决异步问题?
  • 这就是答案!!非常感谢
  • 这会在 chrome 控制台中发出警告,例如 Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check http://xhr.spec.whatwg.org/.
【解决方案2】:

除了存储它没有其他办法。内存分页应该可以减少那里的潜在问题。

我建议不要使用名为“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');

【讨论】:

  • > [ALERT] 这个答案不起作用。阅读下面rfc1484的答案。
  • 可能是因为错过了 $() 就是全部了。
  • 我同意@skozz,它不起作用。它返回未定义。解决这个问题的唯一方法似乎是让asyncfalse
【解决方案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: falseasync:false,最后是 responseText 链接到 $.ajax 请求。

【讨论】:

  • async:false 会造成严重破坏!如果你有一个带有加载 gif 或其他东西的 beforeSend,async 会让它非常难看
  • 这对我来说就像一个魅力。我一直在努力将 ajax 响应存储到全局变量中很长一段时间该死
【解决方案4】:

您不必执行任何这些操作。我的项目遇到了同样的问题。您所做的是在成功回调中进行函数调用以重置全局变量。只要您将异步 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;
}

希望对你有所帮助。

【讨论】:

  • 上帝给我的答案:D
  • 这很好用!只有一件事,if(data == true) 需要更改。它可能只是空的。
  • 我试图从返回的响应 ajax 中重新创建节点。每当我使用现有节点时,我的脚本都会起作用,但在尝试重新创建从 ajax 响应结构化的对象时不起作用。这个解决方案对我有用。我现在不会探索,但我怀疑异步设置会有所不同。
  • 这对我的项目非常有用。我只使用了函数调用。不需要真假的东西
【解决方案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。显然,这是否合适取决于您要达到的目标。

【讨论】:

  • 如此简单!它对我有用,尽管我没有设置输入值,而是使用 jQuery 的 .data() 方法来存储 JSON。
  • 某些应用程序的逻辑解决方案非常干净。建议:如果操作被取消,最好重置your-hidden-controlvalue
【解决方案6】:

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

您可能正试图在 ajax“成功”函数触发之前打印变量的内容。

【讨论】:

    【解决方案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, ...
        

        【讨论】:

        • 感谢降级,但是,嘿,我来这里是为了寻找一个没有阻塞操作的解决方案,对于可能偶然发现这个问题的其他人,我的解决方案可能就是答案!
        • 每个人都在为这个问题发帖,所以我也不妨这样做。从 jQuery 1.8 开始,async: false 已被弃用,处理代码总是比同步请求更好。
        【解决方案10】:

        在事件的“document.ready”阶段,我真的很难将 jQuery ajax 的结果放入我的变量中。

        当用户在页面加载后触发选择框的“onchange”事件时,jQuery 的 ajax 将加载到我的变量中,但在页面首次加载时数据不会提供变量。

        我尝试了很多很多很多不同的方法,但最终,查尔斯·吉尔伯特的方法对我最有效。

        向查尔斯·吉尔伯特致敬!使用他的答案,即使我的页面第一次加载,我也能够将数据放入我的变量中。

        这是一个工作脚本的示例:

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

          我知道线程很旧,但我认为其他人可能会觉得这很有用。根据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; 部分。

          【讨论】:

            【解决方案12】:

            IMO 您可以将此数据存储在全局变量中。但最好使用一些更独特的名称或使用命名空间:

            我的公司 = {};

            ...
            MyCompany.cachedData = 数据;

            而且为了这些目的最好使用json,json格式的数据通常比xml格式的相同数据小得多。

            【讨论】:

            • 当你使用很多全局变量时这很糟糕,但是当你小心使用它们时会很有帮助。 JQuery 使用全局变量(至少 $ 和 jQuery),ExtJS 也使用全局变量。
            【解决方案13】:

            我建议应该避免从服务器获取大型 XML 文件:变量“xml”应该像 cache 一样使用,而不是作为数据存储本身。

            在大多数情况下,可以检查缓存并查看是否需要向服务器发出请求以获取所需的数据。这将使您的应用更轻、更快。

            干杯,jrh。

            【讨论】:

              【解决方案14】:

              .get 响应默认被缓存。因此,您真的不需要做任何事情来获得想要的结果。

              【讨论】:

                【解决方案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>
                

                【讨论】:

                  【解决方案16】:

                  就用这个吧。简单有效:

                  var y;
                  
                  function something(x){
                  return x;
                  }
                  
                  $.get(bunch of codes, function (data){
                  
                  y=something(data);
                  )}
                  
                  //anywhere else
                  console.log(y);
                  

                  【讨论】:

                    猜你喜欢
                    • 2014-12-27
                    • 2014-11-09
                    • 2018-06-03
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-02-18
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多