我得到了以下脚本,该脚本无法正常工作。我知道getJSON的异步性质,所以我尝试构建一个回调函数(jsonConsoleLog
),它应该在getJSON被赋予var(myJson = json;
)之前执行。在Chrome中运行调试后,我得到了两件事:A)debug将getJSON函数中的jsonConsoleLog
调用突出显示为undefined
。
B)控制台正在为TypeError: Cannot read property '0' of null
投掷var friends = myJSON[0].friends;
,这意味着整个功能不起作用。
我从星期六开始和它一起战斗,我真的不知道该怎么做。我的回调函数显然有些东西,但是如果我知道什么的话就开枪吧。帮助
var myJSON = null;
var main = document.getElementsByClassName('main');
var sec = document.getElementsByClassName('sec');
function getJSON(jsonConsoleLog){
$.getJSON('http://www.json-generator.com/api/json/get/cpldILZRfm? indent=2', function(json){
if (json != null){
console.log('Load Successfull!');
};
if (jsonConsoleLog){
jsonConsoleLog(json[0].friends);
}
myJSON = json;
});
};
function jsonConsoleLog(json) {
for (var i = 0; i < json.length; i++) {
console.log('friend: ' + friends[i]);
};
};
getJSON();
var friends = myJSON[0].friends;
function myFn1(){
for(var i = 0; i < friends.length; i++) {
main[i].innerHTML = friends[i].id;
};
};
function myFn2(){
for(var i = 0; i < friends.length; i++) {
main_div[i].innerHTML = friends[i].name;
};
};
main.innerHTML = myFn1();
sec.innerHTML = myFn2();
答案 0 :(得分:1)
您在没有回调参数的情况下调用getJSON
- 因此,jsonConsoleLog
getJSON
剪断...
function blah(json) { // changed name to avoid confusion in the answer - you can keep the name you had
for (var i = 0; i < json.length; i++) {
console.log('friend: ' + friends[i]);
};
};
getJSON(blah); // change made here (used the function name blah as changed above
var friends = myJSON[0].friends;
function myFn1(){
for(var i = 0; i < friends.length; i++) {
main[i].innerHTML = friends[i].id;
};
};
...剪断
的问题
var friends = myJSON[0].friends;
在此重复多次... $.getJSON
异步,您正在尝试使用同步
即。当您分配var friends = myJSON[0].friends;
myJson
尚未在$.getjson
中分配时...实际上,$.getjson
甚至没有BEGUN可以运行
这里的所有代码都经过重新组织和重写,希望能够正常工作
var main = document.getElementsByClassName('main');
var sec = document.getElementsByClassName('sec');
function getJSON(callback) {
$.getJSON('http://www.json-generator.com/api/json/get/cpldILZRfm? indent=2', function(json) {
if (json != null) {
console.log('Load Successfull!');
};
if (callback) {
callback(json);
}
});
};
function doThings(json) {
var friends = json[0].friends;
for (var i = 0; i < friends.length; i++) {
console.log('friend: ' + friends[i]);
};
function myFn1() {
for (var i = 0; i < friends.length; i++) {
main[i].innerHTML = friends[i].id;
};
};
function myFn2() {
for (var i = 0; i < friends.length; i++) {
main_div[i].innerHTML = friends[i].name;
};
};
main.innerHTML = myFn1();
sec.innerHTML = myFn2();
}
getJSON(doThings);
答案 1 :(得分:1)
第一个问题是因为你的函数getJSON
期待一个正式的论证,你称之为jsonConsoleLog
。但是你没有向getJSON
传递任何论据。这意味着在getJSON
内,形式参数jsonConsoleLog
确实是未定义的。请注意,因为您已经命名了形式参数jsonConsoleLog
,该参数与您希望调用的函数同名,所以您在getJSON
内无法访问功能。您需要做的是将函数作为参数传递:
getJSON(jsonConsoleLog);
第二个问题是我想与json
变量有关 - 它没有属性0
(即当您尝试将其视为数组时发生错误,访问元素0),这意味着json
将返回空,或者不是数组。
答案 2 :(得分:0)
正确,完全正常工作的代码(基本上与接受的相同,正确的答案,但在stylistycally有点不同)
var main = document.getElementsByClassName('main');
var sec = document.getElementsByClassName('sec');
var friends = null;
function getJSON(jsonConsoleLog){
$.getJSON('http://www.json-generator.com/api/json/get/cpldILZRfm?indent=2', function(json){
if (json != null){
console.log('Load Successfull!');
};
if (jsonConsoleLog){
jsonConsoleLog(json[0].friends);
}
});
};
function jsonConsoleLog(json) {
for (var i = 0; i < json.length; i++) {
console.log('friend: ' + json[i]);
};
friends = json;
myFn1();
myFn2();
};
function myFn1(){
for(var i = 0; i < friends.length; i++) {
main[i].innerHTML = friends[i].id;
};
};
function myFn2(){
for(var i = 0; i < friends.length; i++) {
main[i].innerHTML += friends[i].name;
};
};
getJSON(jsonConsoleLog);