无法读取未定义的AJAX的属性“长度”

时间:2016-01-11 00:38:11

标签: javascript jquery json ajax

我一直在搜索这个问题,但我的代码中没有得到任何结果。

我这里有一个简单的JSON解析器,它根据端点返回的JSON对象创建一个表。这是我到目前为止所尝试的。

function getAJAXData(APIurl){
$.ajax({
    url: APIurl,
    type: "GET",
    dataType: "json"
}).then(function(data){
    alert(data);
});
}

function generateTable(tableId){

var objRecords = getAJAXData("http://jsonplaceholder.typicode.com/posts");
var cols = addTableHeaders(objRecords, tableId);

for(var i = 0; i < objRecords.length; i++){

    var tRow = $('<tr/>');

    for (var colIdx = 0; colIdx < cols.length ; colIdx++){

        var cellVal = objRecords[i][cols[colIdx]];

        cellVal = (cellVal == null) ? "" : cellVal; 

        tRow.append($('<td/>').html(cellVal)); 
    }
    $(tableId).append(tRow);
}
}

function addTableHeaders(myList, tableId){
var colSet = [];
var headers = $('<tr/>');

for (var i = 0; i < myList.length; i++) {
    var hRow = myList[i];
    for(var key in hRow){
        if($.inArray(key, colSet) == -1){
            colSet.push(key);
            headers.append( $('<th/>').html(key) );
        }
    }
}
$(tableId).append(headers);

return colSet;
}

那个不起作用但是当我对列表进行硬编码时,它会从硬编码列表中生成一个表。有人可以解释我在代码中做错了什么或丢失了什么?谢谢。

2 个答案:

答案 0 :(得分:3)

这两行是一个问题:

var objRecords = getAJAXData("http://jsonplaceholder.typicode.com/posts");
var cols = addTableHeaders(objRecords, tableId);

首先,您的getAJAXData函数不会返回任何内容,因此objRecords将始终未定义。

其次,即使它确实返回了某些内容,也是一个异步调用,因此数据不会立即就绪。

您需要做的是将代码的相关位包装到函数中并在成功回调上调用它,这样只有在您的AJAX数据就绪后才能执行它。

答案 1 :(得分:0)

你需要在ajax成功中调用addTableHeaders

$.ajax({
    url: APIurl,
    type: "GET",
    dataType: "json",
    success: function(data){
    //call it  here
    }
})

});