回调未定义和其他故事

时间:2015-11-16 07:47:49

标签: javascript jquery json jquery-callback

我得到了以下脚本,该脚本无法正常工作。我知道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();

3 个答案:

答案 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);