开头的警报显示“未定义”,为什么?
警报按此顺序排列:
“成功了!”
“数据”(应该是什么)
“未定义”
我通过多个线程阅读,问题始终是ajax是异步的,因此在访问数据时没有定义数据,但在我的情况下数据就在那里,我的函数中的警报显示了另一个警报之前的数据它未定义的地方!
非常感谢任何帮助!
我收到了这段代码
var data = getData("");
alert(data); <<<<<<< UNDEFINED
function getData(fileName) {
$.ajax({
async:false,
type: "GET",
url: "breastCancer.csv",
dataType: "text",
success: function (data) {
var arrData = processData(data);
alert("success!");
alert(arrData); <<<<< WORKS GREAT
return arrData;
},
});
}
function processData(data) {
var arrData = CSVToArray(data);
dimensions = arrData[0];
var objects = [];
objects[0] = dimensions;
for (var i = 1; i < arrData.length; i++){
objects[i] = new Object();
for (var j = 0; j < dimensions.length; j++){
objects[i][dimensions[j]] = arrData[i][j];
}
}
return objects;
}
为了澄清,我知道异步是用户体验的方式,但是这个页面只需要显示来自此调用的数据,所以我可以等待它。
答案 0 :(得分:4)
您的getData
功能无法返回任何内容。
答案 1 :(得分:1)
您需要从函数本身返回它。
getData
^这将返回getData
内的数据。但是function getData(fileName) {
var ourData = "";
$.ajax({
async:false,
type: "GET",
url: "breastCancer.csv",
dataType: "text",
success: function (data) {
var arrData = processData(data);
ourData = arrData;
},
});
return ourData;
}
对它没有任何作用:比如返回它。
getData
这会将数据从 async:false
返回到任何正常运行的调用。
编辑:另外,请勿使用{{1}}。 Your browser won't capture any events happening until that AJAX completes.异步JS的好处是......我们可以!在这种情况下应该。
答案 2 :(得分:1)
前言:不要使用async: false
。但回答这个问题:
getData
不会返回任何内容。您从成功回调中做了return
,但这会从success
回调中返回一些内容,而不是getData
。
要更改它以便getData
返回某些内容,您可以执行以下操作:
function getData(fileName) {
var arrData;
$.ajax({
async:false,
type: "GET",
url: "breastCancer.csv",
dataType: "text",
success: function (data) {
arrData = processData(data);
},
});
return arrData; // <=== Now `getData` returns something
}
但不这样做。相反,采用异步编程并删除async: false
。例如,回调:
function getData(fileName) {
$.ajax({
async:false,
type: "GET",
url: "breastCancer.csv",
dataType: "text",
success: function (data) {
callback(processData(data));
},
});
}
......这样叫:
getData(function(data) {
alert(data);
});
...或承诺($.ajax
返回一种):
function getData(fileName) {
return $.ajax({
async:false,
type: "GET",
url: "breastCancer.csv",
dataType: "text",
success: function (data) {
callback(processData(data));
},
}).then(data) {
return processData(data); // <== Becomes the resolution value of `getData`'s promise
});
}
然后
getData().then(function(data) {
alert(data);
});
答案 3 :(得分:0)
数据未定义,因为函数getData不返回任何内容。你应该看看承诺。