Javascript-为什么这是未定义的?
开始时的警报显示未定义,为什么 警报的顺序如下: 成功! 数据应该是什么 未定义 我通读了多个线程,问题总是ajax是异步的,因此在访问数据时没有定义数据,但在我的例子中,数据在那里,我函数中的警报在未定义的另一个警报之前显示数据 非常感谢您的帮助 我有这个密码Javascript-为什么这是未定义的?,javascript,jquery,ajax,synchronous,Javascript,Jquery,Ajax,Synchronous,开始时的警报显示未定义,为什么 警报的顺序如下: 成功! 数据应该是什么 未定义 我通读了多个线程,问题总是ajax是异步的,因此在访问数据时没有定义数据,但在我的例子中,数据在那里,我函数中的警报在未定义的另一个警报之前显示数据 非常感谢您的帮助 我有这个密码 var data = getData(""); alert(data); <<<<<<< UNDEFINED function getData(fileName) {
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;
}
澄清一下,我知道异步是用户体验的一种方式,但是这个页面只需要显示来自这个调用的数据,所以我可以等待它 您的getData函数不返回任何内容。由于函数getData不返回任何内容,因此数据未定义。您应该看看承诺。您需要从函数本身返回它
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;
},
});
}
这会将数据从getData返回给调用该函数的任何对象
编辑:另外,不要使用async:false。异步JS的好处是…我们可以!在这种情况下,应该。前言:不要使用async:false。但回答这个问题:
getData不返回任何内容。您正在从成功回调返回,但这会从成功回调返回一些内容,而不是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
}
…这样称呼:
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
});
}
不要使用async:false。它不使用吗?函数内部的返回是做什么的?好的,我明白了,我不能将java知识用于JS。您可以从匿名成功函数返回一个值。getData本身不返回任何内容。你的Java知识没有问题,你有两个函数,一个返回,一个不返回。这在技术上是正确的。但是这个答案应该是一个注释。@Marcel关于您的Java知识:lambda中的return语句也不会从它们所包含的函数中返回。我返回了,但老实说,我根本不理解它们。我来自java背景,这应该只是一个小练习,但我发现我不能在JS中真正使用我的java知识…@Marcel我不知道java如何与lambdas的工作方式大致相同,至少在本次讨论中是这样。我明白了,所以返回ajax内部不会跳出封闭函数。谢谢我还不能接受你的回答,因为你太快了!但是效果很好,再次感谢@Marcel当然不是,它从它所在的函数返回。Java的工作方式相同,例如,请参见。函数中定义了一个函数;从lambda返回并不是从封闭函数返回。我发现我误解了ajax,我没有将其视为函数。我不知道你能从阿贾克斯回来,谢谢!这只是返回一个空字符串;这行不通您必须使用回调或承诺。只要完成此ajax调用,页面就不会显示任何内容或占位符数据,这将更加混乱而不是有用。但我明白了异步的意义,我会努力理解承诺,谢谢@Marcel:即便如此,锁定UI还是很糟糕的UX,因此显示一些内容,比如加载而不锁定UI,然后用ajax结果替换UI通常是最好的。我倾向于将加载延迟250毫秒,这样如果调用很快完成,它就不会在用户面前闪烁。不管好坏祝你好运-
getData(function(data) {
alert(data);
});
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);
});