2016-04-12 18 views
0

私はコンソールのログをfileContentが正しい出力を与えるときにこのようなコードを持っていますが、返すようにしようとするとエラーになります。未定義のコールバックを取得

他の機能ではcsvファイルの内容を使いたいと思います。コードをきれいに保ちながら。

;(function(){ 

    function readTextFile(file) 
    { 
var rawFile = new XMLHttpRequest(); 
rawFile.open("GET", file, true); 
var fileContent; 
rawFile.onreadystatechange = function() 
{ 
    if(rawFile.readyState === 4) 
    { 
     if(rawFile.status === 200 || rawFile.status == 0) 
     { 
      var allText = rawFile.responseText; 
      fileContent =csvJSON(allText); 
      return fileContent; 
     } 
    } 
} 
rawFile.send(null); 
    } 


    function csvJSON(csv){ 
    var lines=csv.split("\n"); 

    var result = []; 

    var headers=lines[0].split(","); 

    for(var i=1;i<lines.length;i++){ 

    var obj = {}; 
var currentline=lines[i].split(","); 

for(var j=0;j<headers.length;j++){ 
    obj[headers[j]] = currentline[j]; 
} 

result.push(obj); 

    } 

    return result; //JavaScript object 
    //return JSON.stringify(result); //JSON 
    } 

    var mainContent = readTextFile("main.csv"); 


    })(); 

答えて

0

非同期作業について少し知っておく必要があります。ハンドラーをreadystatechangeに設定すると、そのイベントをXMLHttpRequestから登録するだけで、このイベントが発生したときに関数が呼び出されます。したがって、この関数は何かをあなたに返すことはできません。 callbackという別の関数を指定してハンドラで呼び出した後を除いて、

これを見て:

function readTextFile(file, callback) { 
    var rawFile = new XMLHttpRequest(); 
    rawFile.open("GET", file, true); 
    var fileContent; 
    rawFile.onreadystatechange = function() { 
     if(rawFile.readyState === 4) { 
      if(rawFile.status === 200 || rawFile.status == 0) { 
       var allText = rawFile.responseText; 
       fileContent =csvJSON(allText); 
       callback(fileContent); 
      } 
     } 
    } 

そして、あなたがリクエストしたいとき:

readTextFile('main.csv', function(data) { 
    console.log(data); 
} 

をこれがどのように非同期演算作業です。

関連する問題