javascript - jQuery 异步问题,GET 请求后变量赋值

标签 javascript jquery ajax json get

我确信解决方案就在我眼前,但我就是看不到它。我正在尝试从外部文件源加载对象。我已经使用 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;
    }
});

最佳答案

您看到未定义的原因是因为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 - jQuery 异步问题,GET 请求后变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7353257/

相关文章:

javascript - 查找单词在文本中的位置

javascript - bind 和 var self=this 的区别?

javascript - 为 li 列表创建 "prev/next"

javascript - 整合 $.ajax

javascript - 为什么我的脚本只获取我的 php 表的第一行?下面是我的代码

javascript - 在 jQuery 中从对象数组中取出一个项目

javascript - 如何使用 lodash 做 deep _.omitby

javascript - 如何在不调用方法的情况下通过另一个方法传递一个方法,并将一个变量对象传递给它?

javascript - jCarousel 在鼠标悬停时立即停止

ruby-on-rails - 使用 AWS Cloudfront 异步加载 Google map