2

这是我在 Firebug 中输入的脚本:

var jsonData;

$.getJSON("./js/ohno.JSON",function(data){
    jsonData = data;
});

console.log(jsonData);

这是 .JSON 文件的内容:

{"oh":"no"}

我第一次在 Firebug 中运行脚本时,它返回“未定义”

我第二次运行它(不刷新页面)它返回对象。

如果我刷新,同样的事情会发生——第一次运行返回“未定义”,第二次运行返回对象。

.JSON 文件是

如何使它在我第一次运行脚本时返回对象?

4

5 回答 5

9

getJSON 是异步的;这意味着脚本将继续执行,同时仍会加载数据。

你必须等到它完成。

var jsonData;

$.getJSON("./js/ohno.JSON",function(data){
    jsonData = data;
    console.log(jsonData);
});
于 2013-01-17T22:47:02.753 回答
4

您需要将console.log(以及您要在其上运行的任何其他代码data)放置在回调函数中:

$.getJSON("./js/ohno.JSON",function(data){
    jsonData = data;
    console.log(jsonData);
});

.ajaxComplete如果您觉得需要将其分开,您也可以使用。

于 2013-01-17T22:47:07.400 回答
3

getJSON是异步的,这就是为什么你必须提供一个回调来处理数据。该请求已被触发,但在您到达时尚未完成console.log,因此该值未定义。它会在短时间内完成并设置变量。

将您的console.log处理程序移动到您的回调中,一切都应该按预期工作。

于 2013-01-17T22:47:17.493 回答
1

匿名function是一个异步回调,所以它你的console.log. 这是正确的方法:

var jsonData;

$.getJSON("./js/ohno.JSON",function(data){
    jsonData = data;
    console.log(jsonData);
});
于 2013-01-17T22:48:49.990 回答
1

The getJSON function is asynchronous, so the success callback function only gets executed once the request finishes. Your console.dir() is initially executing before the response happens.

Put the console.dir() inside your getJson handler function.

于 2013-01-17T22:50:32.493 回答