为什么我无法在控制台中看到这个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?
}
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 });
这是一个异步调用,执行'的console.log(JSON)'(函数(){})'函数[API的getJSON(HTTP:// API .jquery.com/jquery.getjson /) – SerCrAsH
您的getJson函数是异步的。这意味着它会在你的getJson之前得到你的console.log的答案。 – klauskpm