我有一个外部json文件file.json
,我正在尝试将一个数组存储在其中,以便我可以将它用作Javascript数组。
JSON文件:
{
"data": [
{
"Name": "Steve",
"Number": "120",
"Number2": "78",
"Number3": "75",
"Number3": "85"
},
{
"Name": "Bob",
"Number": "130",
"Number2": "98",
"Number3": "85",
"Number3": "85"
},
{
"Name": "Joe",
"Number": "430",
"Number2": "88",
"Number3": "75",
"Number3": "89"
}
]
}
"数据"之后有一个数组,我想将它用作数组。 这就是我的尝试:(只是为了测试)
$.getJSON( "file.json", function( json ) {
for (var i = 0; i < json.data.length; i++) {
var Test = json.data[i];
console.log(Test.Name);
}
});
alert(Test.Name);
虽然它没有返回阵列,但警报也没有工作。是否有一个原因?并且,如果我可以在函数外部获取变量或对象,我如何创建一个数组并将其传递到外部? 谢谢!
答案 0 :(得分:0)
sencha app run native
与$.getJSON()
同时启动,但在获取并加载数据之前,不会调用回调函数(alert()
)。
因此,当您要求function( json )
时,没有alert(Test.Name)
提醒!那还没有处理完毕。
Test.Name
您无法在函数外部访问Test,因为它在其中定义。在函数外部的范围内定义它将允许访问它,但是在JSON回调完成之前它将是一个空数组。
答案 1 :(得分:0)
// Define it where you want it to be accessible
var people;
$.getJSON("file.json", function (json) {
// Store the data in people to make it accessible globally
people = json.data;
people.forEach(function(person){ console.log(person.Name); });
doSomethingElse();
});
// Would cause an error, you didn't receive the data yet
alert(people[0].Name); // Uncaught TypeError: Cannot read property '0' of undefined
// Would work if it is called after receiving the data (inside the callback or later)
function doSomethingElse(){
alert(people[0].Name); // 'Steve'
}
答案 2 :(得分:0)
这是由$.getJSON
的异步操作引起的。基本上发生的是JS引擎在您的程序中工作,它遇到$.getJSON
的语句,执行它(然后等待事件循环中的响应)并继续执行下一个语句{{1} }。由于事件循环尚未查看是否存在响应,alert
的值为Test.name
(实际上应该抛出错误,除非您在...之外的某处声明了undefined
Test
响应处理程序)。
例如:
$.getJSON
&#13;
您认为产量是多少?运行它并检查您的控制台输出或只看这里:
var foo;
// using setTimeout as a proxy async operation for $.getJSON
setTimeout(function() {
foo = 'FOO';
console.log('Inside the async operation', foo);
}, 0); // Approximate running in next loop of the event cycle
console.log('Outside the async operation', foo);
那么如何在不将代码嵌入到响应函数中的情况下获得其余代码的值?两种主要方式是使用回调函数(类似于Node&#39;首选样式)或使用promises。
如果您没有注意到您已经在使用回调功能。这就是您传递给> Outside the async operation undefined
> Inside the async operation FOO
的函数被称为。因此,您可以向该函数添加更多代码,或将其分解为从现有响应处理程序调用的另一个函数。
$.getJSON
&#13;
或者你可以使用承诺。由于Promise
的原生JS实现相对较新,因此存在许多库,允许您在旧版浏览器上使用它们以及包括额外功能。