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 に答える