我有以下代码。我可以调用函数“titlename”并执行StatList函数来读取CSV文件。但是我无法返回任何值。从在线浏览我发现这个问题可能与Ajax有关,但我不知道Ajax。我想在以下示例中返回“titles”变量。
function titlename(title_number)
{
jQuery.get('TitleName.csv', function StatList(data)
{
var titles = new Array();
var title_array = jQuery.csv(undefined, undefined, '\r\n')(data);
for (var i=0; i<title_number.length; i++){
for (var j = 1; j< title_array.length; j++)
{
var tmp_compare = title_array[j].slice(0,title_array[j].length-1);
if(tmp_compare.toString() == title_number[i]){
var title = title_array[j][(title_array[j].length-1)];
//console.log(title);
titles.push(title);
break;
}
}
}
return titles;
});
}
答案 0 :(得分:2)
由于AJAX是异步的,因此您不能简单地将值从调用返回到titlename
。一旦到达,您可以使用该信息调用另一个函数并传入您想要作为参数获取的数据。您可以在现场处理数据,也可以在运行的函数中处理数据。出于演示目的,我会将您的代码保留在原来的位置。
以下是潜在下一步的示例:
var handleTitleData = function(titles){
// Do whatever you want now that you have the titles
}
var titlename = function(title_number){
jQuery.get('TitleName.csv', function StatList(data){
var titles = new Array();
var title_array = jQuery.csv(undefined, undefined, '\r\n')(data);
for (var i=0; i<title_number.length; i++){
for (var j = 1; j< title_array.length; j++){
var tmp_compare = title_array[j].slice(0,title_array[j].length-1);
if(tmp_compare.toString() == title_number[i]){
var title = title_array[j][(title_array[j].length-1)];
titles.push(title);
break;
}
}
}
handleTitleData(titles);
});
}
答案 1 :(得分:2)
正如其他人所说,当你调用异步函数时,JavaScript将继续正常执行而不等待来完成它,因此它将在定义titles
之前返回。为了获得异步调用的结果,您可以使用$.Deferred
对象:
function titlename(title_number) {
return jQuery.get('TitleName.csv').pipe(function (data) {
var titles = new Array();
var title_array = jQuery.csv(undefined, undefined, '\r\n')(data);
for (var i=0; i<title_number.length; i++) {
for (var j = 1; j< title_array.length; j++) {
var tmp_compare = title_array[j].slice(0,title_array[j].length-1);
if(tmp_compare.toString() == title_number[i]){
var title = title_array[j][(title_array[j].length-1)];
//console.log(title);
titles.push(title);
break;
}
}
}
return titles;
});
}
titlename([1,2,3]).done(function(titles) {
// do what you want with the returned titles
}).fail(function() {
// deal with a failure in getting the .csv
});