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

Cannot read property 'length' of undefined AJAX

本文关键字:未定义 AJAX 长度 读取 属性      更新时间:2023-09-26

我已经在整个SO中搜索了这个问题,但在我的代码中没有得到任何结果。

这里有一个简单的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;
}

这个不起作用,但当我硬编码一个列表时,它会从硬编码的列表中生成一个表。有人能解释一下我在代码中做错了什么或遗漏了什么吗?谢谢

这两行是一个问题:

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

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

其次,即使它确实返回了一些东西,它也是一个异步调用,所以数据不会马上准备好。

您需要做的是将代码的相关部分封装到一个函数中,并在成功回调时调用它,这样它只有在AJAX数据准备好后才能执行。

您需要在ajax成功内部调用addTableHeaders

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