使用$ .getJSON获取URL并正确解析它

时间:2010-04-17 05:26:00

标签: javascript jquery json

这可能真的很愚蠢但我找不到我的代码的问题。它获取一个返回json的url,然后该函数返回一个字符串:

function getit() {
  var ws_url = 'example.com/test.js';
  var user = false;

  $.getJSON(ws_url, function(data) {
    alert('user '+data.user);//shows john
    user = data.user || false;
  });

  return user;//should return john but returns false
}

test.js会有这样的东西:

{"id":"12","username":"ses","user":"john","error":""}

或者像这样:

{"error":"123"}

我也试过if (data.user) {} else {},但它也没有用。

那我缺少什么?

谢谢:)

2 个答案:

答案 0 :(得分:4)

问题来自于$.getJSON()调用是异步的。一旦ajax请求被触发,处理继续在getit()内部,并且您的函数立即返回false。稍后,Ajax响应会返回并设置user,但很久以前您的getit()函数return已经编辑!

您可以使用async选项强制Ajax调用同步,如下所示:

  $.ajax({
    async: false,
    url: ws_url,
    type: "GET",
    success: function(data) {
        alert('user '+data.user);//shows john
        user = data.user || false;
    }
  });

如果这样做,浏览器将阻止脚本,直到Ajax调用返回。通常这不是理想的行为(这就是为什么默认值为async: true),因此我建议重新处理调用getit()的任何内容,并且只要它能够处理它的结果,也许将它自己的回调函数传递给getit(),然后在getit()完成时执行。

答案 1 :(得分:2)

Ajax是异步的,这意味着脚本的其余部分不会坐下来等待它继续前进。如您的示例所示,在ajax函数从服务器接收响应之前,正在到达return行,因此用户变量在该时间点仍为false。

如果要强制ajax调用同步运行,可以使用jQuerys $.ajax方法并将async参数设置为false。

$.ajax({
  url:ws_url,
  dataType:"json",
  async:false,
  success:function(data){
    alert('user '+data.user);//shows john
    user = data.user || false;
  }
});