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

时间:2011-09-08 19:14:24

标签: 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;
    }
});

4 个答案:

答案 0 :(得分:5)

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

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


P.S。您不需要parseJSON - 如果响应具有正确的mime类型集,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
});

答案 1 :(得分:1)

当ajax仍在处理时,

函数被处理为结束事件。将其插入回调函数

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

同步和get中的console.log是异步。

尝试:

$(function() {
    var partnerData;

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

    function test(){
        console.log(partnerData); 
    }
});