将json加载到变量中

Aar*_*ron 48 jquery json getjson

我必须做一些非常简单的事情,但据我所知,似乎没有一种简单的方法可以做到这一点.我只想从远程源加载JSON数据,并使用jQuery将其存储在全局Javascript变量中.这就是我所拥有的:

var my_json;
$.getJSON(my_url, function(json) {
  var my_json = json;
});
Run Code Online (Sandbox Code Playgroud)

my_json变量仍未定义.我认为这显然是一个范围问题.在我看来,$ .getJSON方法应该返回JSON,但它返回一个XMLHttpRequest对象.如果我这样做:

request = $.getJSON(my_url);
my_json = request.responseText.evalJSON();
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为在readystate == 4之前,responsetext保持为null.看来你必须使用回调函数来返回响应文本,因为它会在成功时触发.

这不可能是这么难!对?

kar*_*m79 125

这样做:

var json = (function () {
    var json = null;
    $.ajax({
        'async': false,
        'global': false,
        'url': my_url,
        'dataType': "json",
        'success': function (data) {
            json = data;
        }
    });
    return json;
})(); 
Run Code Online (Sandbox Code Playgroud)

主要问题是$.getJSON将异步运行,因此您的Javascript将在其success回调触发之前进行调用它的表达式,因此无法保证您的变量将捕获任何数据.

请特别注意'async': false上述ajax调用中的选项.该手册说:

默认情况下,所有请求都是异步发送的(默认情况下设置为true).如果需要同步请求,请将此选项设置为false.请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作.

  • 这是不推荐使用的用法.不再允许`async:false`. (7认同)

Cou*_*ero 28

代码位应该是:

var my_json;
$.getJSON(my_url, function(json) {
  my_json = json;
});
Run Code Online (Sandbox Code Playgroud)

  • 这怎么避免上面提到的异步问题? (5认同)
  • 最有可能试图强制执行同步ajax调用是一个坏主意,ajax是用于异步调用的。这个答案应该是上述问题的理想解决方案,由我+1。 (2认同)
  • 它根本无法防止异步问题。 (2认同)