为什么我不能在控制台中看到这个JSON?

时间:2015-09-04 22:10:45

标签: jquery json

使用以下jQuery,为什么我不能在json函数之外使用$.getJSON() var?如果我将console.log()放在$ .getJSON回调函数中,它可以工作,但为什么不在外面呢?

function getMyJson() {
    var json;
    $.getJSON('/cdnBuffet.json', function (data) {
        json = data;
    });

    console.log(json);  // nothing is shown in console here. Why?
}

4 个答案:

答案 0 :(得分:2)

JavaScript通常用作带回调的异步函数 - 试图将其强制转换为同步函数通常是初学者的错误,后来人们后悔。

您的ajax调用通常是异步调用,您指定的function是在ajax调用完成时执行的回调。

在您的代码中,console.log在ajax调用完成之前执行。

只需在回调中移动console.log,如下所示:

function getMyJson() {
    var json;
    $.getJSON('/cdnBuffet.json', function (data) {
        json = data;
        console.log(json);  // will now show the data...
    });
}

如果您确实需要将其返回到调用函数getMyJson,只需扩展getMyJson的编程范例以进行回调,例如:

function getMyJson(myCallback) {
    var json;
    $.getJSON('/cdnBuffet.json', function (data) {
        json = data;
        console.log(json); 
        myCallback(json); // this will return the data to the callback
                          //  specified by the use of the function
    });
}

答案 1 :(得分:0)

执行第$.getJSON行时,填充它的回调函数尚未触发。

但是,如果之后,您在控制台中输入相同的行,您应该看到它有一些数据(假设SendKeys()确实返回了json)。

答案 2 :(得分:-2)

您可以省略默认.getJSON

的异步优势

调用.ajaxSetup

$.ajaxSetup({
  async: false
});

或修改为更长版本的getJSON,.ajax并将async设置为false

$.ajax({
   url: URL,
   dataType: 'json',
   async: false,
   data: stuff,
   success: function(data) {
    }
});

答案 3 :(得分:-2)

您的数据未打印出来的原因是因为$.getJSON(...)调用是异步的,这意味着它在后台执行,并且在完成之前不会阻塞(等待)直到完成下一个语句(打印) )。这意味着当您尝试打印数据时,仍会在后台检索该数据。

在后台执行HTTP请求有很多好处,但最常见的做法是,在请求完成时,您的应用程序不会停止并显示为冻结。

在任何情况下,如果您真的必须编写函数式代码,那么您始终可以通过在开头配置ajax请求来使调用异步。你可以这样做:

$.ajaxSetup({ async: false });