【问题标题】:fetching a url using $.getJSON and parsing it correctly使用 $.getJSON 获取 url 并正确解析
【发布时间】:2010-04-17 05:25:59
【问题描述】:

这可能真的很愚蠢,但我找不到我的代码的问题。它获取一个返回 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 {},但也没有用..

那我错过了什么?

谢谢:)

【问题讨论】:

    标签: javascript jquery json


    【解决方案1】:

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

    您可以使用 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() 完成时执行。

    【讨论】:

      【解决方案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;
        }
      });
      

      【讨论】:

        猜你喜欢
        • 2019-08-15
        • 2017-02-11
        • 1970-01-01
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 2013-01-05
        • 2014-12-02
        • 1970-01-01
        相关资源
        最近更新 更多