Javascript - 为什么这是未定义的?
Javascript - why is this undefined?
开始时提示显示"undefined",为什么?
警报按以下顺序出现:
"success!"
"Data"(应该是什么)
"undefined"
我通过多个线程读取,问题始终是 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;
}
澄清一下,我知道异步是实现用户体验的方式,但此页面只需要显示来自此调用的数据,所以我可以等待它。
你的 getData
函数没有 return 任何东西。
数据未定义,因为函数 getData 没有 return 任何东西。你应该看看 promises。
您需要从函数本身 return 它。
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;
},
});
}
^ 这 return 是 getData
内的数据。但是 getData
没有对它做任何事情:比如 returning 它。
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;
}
这 return 将数据 从 getData
发送到任何调用该函数的地方。
编辑:另外,不要使用 async:false
。 Your browser won't capture any events happening until that AJAX completes. 异步 JS 的好处是……我们可以!在这种情况下应该。
前言:不要使用async: false
。但回答问题:
getData
没有 return 任何东西。您正在从成功回调中执行 return
,但 return 是来自 success
回调的内容,而不是 getData
。
要将其更改为 getData
return,您可以这样做:
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
return 之类的):
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);
});
开始时提示显示"undefined",为什么?
警报按以下顺序出现:
"success!"
"Data"(应该是什么)
"undefined"
我通过多个线程读取,问题始终是 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;
}
澄清一下,我知道异步是实现用户体验的方式,但此页面只需要显示来自此调用的数据,所以我可以等待它。
你的 getData
函数没有 return 任何东西。
数据未定义,因为函数 getData 没有 return 任何东西。你应该看看 promises。
您需要从函数本身 return 它。
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;
},
});
}
^ 这 return 是 getData
内的数据。但是 getData
没有对它做任何事情:比如 returning 它。
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;
}
这 return 将数据 从 getData
发送到任何调用该函数的地方。
编辑:另外,不要使用 async:false
。 Your browser won't capture any events happening until that AJAX completes. 异步 JS 的好处是……我们可以!在这种情况下应该。
前言:不要使用async: false
。但回答问题:
getData
没有 return 任何东西。您正在从成功回调中执行 return
,但 return 是来自 success
回调的内容,而不是 getData
。
要将其更改为 getData
return,您可以这样做:
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
return 之类的):
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);
});