68

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

16 回答 16

71

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

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");
于 2010-08-17T15:17:08.820 回答
35

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

我建议不要使用名为“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');
于 2009-05-25T04:35:00.060 回答
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;

需要注意的重要事项:global: falseasync:false最后responseText链接到$.ajax请求。

于 2011-12-30T13:40:07.500 回答
18

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

希望这可以帮助你。

于 2011-01-19T17:33:21.213 回答
10

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

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

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

这样做的好处是不需要将 async 设置为 false。显然,这是否合适取决于您要达到的目标。

于 2015-03-08T17:02:40.867 回答
8

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

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

于 2011-05-17T12:46:55.660 回答
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');

这行得通!!!

于 2014-12-26T09:45:36.340 回答
3
     function get(a){
            bodyContent = $.ajax({
                  url: "/rpc.php",
                  global: false,
                  type: "POST",
                  data: a,
                  dataType: "html",
                  async:false
               } 
            ).responseText;
            return bodyContent;

  }
于 2011-07-13T14:18:00.873 回答
2

也碰到了这个。很多答案,然而,我将提供一个简单正确的答案。关键是让你的 $.ajax 调用..sync!

$.ajax({  
    async: false, ...
于 2012-08-23T14:35:11.943 回答
2

在事件的“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");
于 2012-09-19T17:22:14.297 回答
1

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

于 2011-08-26T10:31:35.557 回答
0

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

我的公司 = {};

...
MyCompany.cachedData = 数据;

并且最好使用 json 来实现这些目的,json 格式的数据通常比 xml 格式的相同数据小得多。

于 2009-05-25T04:35:03.803 回答
0

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

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

干杯,jrh。

于 2009-05-25T05:06:16.977 回答
0

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

于 2009-05-25T05:06:52.873 回答
0

与上一个答案类似:

<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>
于 2019-07-21T00:17:45.330 回答
0

就用这个。简单有效:

var y;

function something(x){
return x;
}

$.get(bunch of codes, function (data){

y=something(data);
)}

//anywhere else
console.log(y);
于 2020-04-23T16:39:31.847 回答