使用以下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?
}
答案 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 });