1

我有以下代码。我可以调用函数“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;
    });
}
4

2 回答 2

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);
    });
}
于 2012-08-23T23:28:04.573 回答
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
});
于 2012-08-23T23:30:57.730 回答