2017-07-20 6 views
2

.CSVファイル内のレコードから特定のフィールドを取得しようとしています。 onload関数の後に変数recordにアクセスすることはできません。JavaScriptはFileReader変数を取得できません

var record; 

//FileReader to read contents of CSV 
var reader = new FileReader(); 


var file = document.getElementById('csvFileUploadID').files[0]; 

reader.onload = function(event) { 
    reader.readAsText(document.getElementById('csvFileUploadID').files[0]); 
    record = reader.result.split(/\r\n|\r|\n/)[1]; 
    record = record.split(',')[1] 
}; 

//Can't access the 'record' variable here. 

この問題の解決策はクロージャーに関連している可能性が高いと私は考えています。

助けてください。

+2

onloadはasyncです。 – mehulmpt

+1

あなたは 'onload'の外でそれを操作しようとしているときにおそらく読み込まれません - その機能をカプセル化し、' onload'操作の最後に呼び出す関数に入れる必要があります。また、私はあなたのコードの残りの部分を見ることはできませんが、変数宣言なしで変数を使用しないようにしてください(他のコードによってはそうでないかもしれません)。 –

答えて

2

この種の非同期コードを処理するという約束をすることができます。

var file = document.getElementById('csvFileUploadID').files[0]; 

function readRecord(file) { 
    return new Promise(function(resolve, reject) { 
    var reader = new FileReader(); 
    reader.onload = function(event) { 
     reader.readAsText(document.getElementById('csvFileUploadID').files[0]); 
     record = reader.result.split(/\r\n|\r|\n/)[1]; 
     record = record.split(',')[1]; 
     resolve(record); 
    }; 
    }); 
}; 


readRecord(file).then(function(record) { 
// access record here 
}); 
+0

技術的には、これはエラーです。なぜなら、['const/let'宣言は起きないからです。](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Temporal_Dead_Zone_and_errors_with_let )(私はあなたがこれを 'var'に変換するバーベルに慣れていると仮定し、コードはまだ動作します:))。定義した後で 'readRecord'を使うべきです。 – nem035

+0

@ nem035すてきなキャッチ!完全にそれを逃した。ありがとう – mehulmpt

+0

私は尋ねることが嫌いですが、矢印関数式を持たないようにこれを修正してもよろしいですか?私のIDEでうまくいきません。私はそれに精通していません。 –