Jquery - 将Ajax jSON响应存储为变量

17

我正试图获取ajax请求的结果并将其设置为可以在请求之外访问的变量。我尝试了JQuery - Storing ajax response into global variable,但我的变量 beer $.getJSON $.ajax 函数之外仍然未定义(我两者都尝试过)。

这是我的代码以及我能够从 console.log(beer)中看到结果的位置。

var beer;
$.getJSON(jsonUrl, function (json) {
    beer = json;
    console.log(beer); // returns beer
});
console.log(beer); // returns undefined

var beer = (function () {
    var result;

    $.ajax({
        url: jsonUrl,
        success: function (data) {
            result = data;
            console.log(beer); // returns beer

        }
    });
    console.log(result); // returns undefined
    if (result) return result;
})();
console.log(beer); // returns undefined
3个回答

21

这是一个异步请求,因此它被触发了,但是您的脚本在继续执行之前不会等待响应。如果您需要等待ajax请求完成,请尝试以下方法:

var beer;
$.getJSON(jsonUrl,function(json){
    beer = json;   
    checkDrink();                
});         

function checkDrink() {
    console.log(beer);
}   

1
那么我如何在函数外部访问啤酒呢? - Sebastien
1
任何依赖于该JSON请求结果的内容都需要在单独的函数中。 - chprpipr
为什么这个不起作用呢?beer = $.ajax({ url: jsonUrl, success: function(data) { return data; } }); - Sebastien
1
"success"是$.ajax()对象上的一个事件。只有在它从服务器得到响应之后才会执行该函数,而这可能需要从执行时间起10毫秒到10分钟的时间。同时,您的主要代码行将继续执行。 - chprpipr

10

建议使用下面的代码:

var beer = $.ajax({
    url: jsonUrl,
    async: false,
    dataType: 'json'
}).responseJSON;

关键时刻是:

  1. async 设为 false,以变量形式返回结果,而不是异步调用成功回调函数
  2. dataType 设为 json,将服务器响应字符串解析为json格式

1
问题在于你试图在数据实际从服务器返回之前访问它,'success'函数实际上是一个回调函数,在ajax调用成功完成时被调用。$.ajax(或$.get)函数立即返回...
你需要以某种方式向感兴趣的函数发出信号,告诉它们已经通过你的成功回调将数据存储在'beer'变量中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接