为什么我无法在控制台中看到这个JSON?

问题描述:

使用以下jQuery,为什么我不能在$.getJSON()函数之外使用json var?如果我把console.log()放在$ .getJSON回调函数中,它可以工作,但为什么不在外面?为什么我无法在控制台中看到这个JSON?

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

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

这是一个异步调用,执行'的console.log(JSON)'(函数(){})'函数[API的getJSON(HTTP:// API .jquery.com/jquery.getjson /) – SerCrAsH

+2

您的getJson函数是异步的。这意味着它会在你的getJson之前得到你的console.log的答案。 – klauskpm

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 
    }); 
} 

那么你可以省略默认.getJSON

呼叫.ajaxSetup

$.ajaxSetup({ 
    async: false 
}); 

的异步利益或修改到的getJSON中,阿贾克斯的更长的版本和异步设置为false

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

当行console.log(json);执行时,您的回调函数在那个人口中,它还没有被解雇。但是,如果之后在控制台中输入相同的行,则应该看到它有一些数据(假设$.getJSON确实返回了json)。

原因数据不打印出来是因为$.getJSON(...)呼叫是异步的,这意味着它在后台执行,并且不阻塞(等待),直到它米之前完成接下来的陈述(印刷)。这意味着,当您尝试打印数据时,该数据仍在后台检索。

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

在任何情况下,如果您确实必须编写功能样式的代码,那么您始终可以通过在开始时配置您的ajax请求来实现异步调用。你可以这样做:在`.done

$.ajaxSetup({ async: false });