【问题标题】:jQuery Async Issue, Variable Assignment After GET RequestjQuery 异步问题,GET 请求后的变量赋值
【发布时间】:2011-09-08 19:14:24
【问题描述】:

我确信解决方案正盯着我的眼睛,但我就是看不到它。我正在尝试从外部文件源加载对象。我已经尝试了几种使用 jQuery 内置方法的方法,但一直返回undefined。我的问题是范围吗?我需要partnerData,因为我的脚本中有其他依赖方法。我不想在$.get 回调中操作我网站的其余功能。非常感谢任何帮助,这是代码:

$(function() {

    var partnerData;

    $.get('data/partners.json', function(file) {
        partnerData = $.parseJSON(file);
    });

    console.log(partnerData); /* returns undefined instead of object */

});

编辑:

感谢大家的所有反馈。这是我采用的解决方案:

var partnerData;

$.ajax({
    url: 'data/partners.json',
    dataType: 'json',
    async: false,
    success: function(data) {
        partnerData = data;
    }
});

【问题讨论】:

    标签: javascript jquery ajax json get


    【解决方案1】:

    您看到undefined 的原因是默认情况下ajax 请求是异步的。这意味着您的get 方法被调用并且代码流向下移动到下一条语句,而请求在后台执行。当请求完成时,稍后会调用您的回调函数。

    在这种情况下使用回调函数是一种常见的模式。但你似乎在说你不想这样做或不能这样做。在这种情况下,您可以使用 async: false 来强制请求同步。但是请记住,您的代码将在请求中被阻止,如果它是一个长期存在的请求,则用户体验会因为浏览器锁定而降低。


    附:您不需要parseJSON - 如果响应具有正确的 mime-type 集,jQuery 将智能地猜测类型并自动解析 JSON。如果服务器没有发回正确的 mime 类型,你也可以明确地告诉 jQuery 预期的返回数据类型是什么;见dataType argument to $.get()


    您可以修改代码以强制同步请求的一种方式:

    $.ajax({
      type: 'GET',
      url: 'data/partners.json',
      success:  function(file){
                   partnerData = $.parseJSON(file);
                   //ideally you would perform a callback here 
                   //and keep your requests asynchronous
                },
      dataType: 'json',
      async: false
    });
    

    【讨论】:

    • 那么,我在请求完成之前将我的变量记录到控制台?
    • 是的,完全正确。请查看我的答案的编辑 - 您可以强制请求同步,但这通常不是一个好主意,它应该是最后的手段。
    • 在 Javascript 中检索文件数据的非异步替代方法是什么?除了使用XMLHttpRequest 对象或$.ajax 之外,是否还有内置方法?
    • @65Fbef05:不要进行同步调用。让您的应用程序使用回调,这对 JavaScript 来说并不难。所有必须处理响应的代码都应该在响应处理程序内部或从响应处理程序调用。
    • FWIW:$.get 还接受一个参数,即数据类型:$.get('data/partners.json', function(file) {...}, 'json');
    【解决方案2】:

    当仍在处理 ajax 时,函数被处理到结束事件。插入到回调函数中

    $(function() {
        var partnerData;
        $.get('data/partners.json', function(file) {
            partnerData = $.parseJSON(file);
            console.log(partnerData);
        });
    });
    

    【讨论】:

      【解决方案3】:

      如果 $.get 是 AJAX,我会说您的问题与我刚刚解决的问题相同!它正在设置一个变量,要在回调之外读取该变量,您需要等待响应!所以你必须设置 async=false!

      【讨论】:

        【解决方案4】:

        console.log 是同步的,get 是异步的。

        尝试:

        $(function() {
            var partnerData;
        
            $.get('data/partners.json', function(file) {
                partnerData = $.parseJSON(file);
                test();
            });
        
            function test(){
                console.log(partnerData); 
            }
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-27
          • 2015-07-02
          • 2015-02-25
          • 1970-01-01
          • 2016-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多