3

ファイルリーダーAPIを理解していないだけかもしれませんが、

実行しようとすると:

for (var i = 0, f1, f2; f1 = files[sorted_index[i]], f2 = files[sorted_index[i+1]]; i=i+2) {
    var file_one;
    var file_two;

    if(f1.size < f2.size){
        file_one = f1;
        file_two = f2;
    } else {
        file_one = f2;
        file_two = f1;
    }

    var file_one_contents;
    var file_two_contents;


  var reader = new FileReader();
  reader.readAsText(file_one);
  reader.onload = readSuccess;

  function readSuccess(evt){
    file_one_contents = evt.target.result;
  }
  var reader = new FileReader();
    reader.readAsText(file_two);
    reader.onload = readSuccess2;

  function readSuccess2(evt2){
    file_two_contents = evt2.target.result;
  }

    console.log(file_one_contents);
    console.log(file_two_contents);

コンソール ログにはundefinedしか含まれていません。スクリプトの目的は、2 つの CSV を読み取り、ファイルのペアからデータを取得して計算を行うことです。

ありがとう!

4

2 に答える 2

5

API は非同期です。操作が完了すると「成功」関数が呼び出されますが、それはすぐには行われません。

console.log()呼び出しをハンドラー関数に移動します。

編集— 両方のファイルの準備が整うまで作業を開始するのを待つ必要がある場合は、次のようにすることができます。

  var countdown = 2;

  var reader = new FileReader();
  reader.readAsText(file_one);
  reader.onload = readSuccess;

  function readSuccess(evt){
    file_one_contents = evt.target.result;
    countdown--;
    if (countdown === 0) go();
  }
  var reader = new FileReader();
    reader.readAsText(file_two);
    reader.onload = readSuccess2;

  function readSuccess2(evt2){
    file_two_contents = evt2.target.result;
    countdown--;
    if (countdown === 0) go();
  }

もちろん、もっと洗練された方法もありますが、その単純なトリックは、カウンターがゼロになるまで待ってから、ファイルを処理する関数を表す「go()」を呼び出すだけです。

于 2012-07-30T16:08:59.143 に答える
3

「onload」の代わりに「.onloadend」を使用して、ファイルの読み取り待機を解決する同様の問題がありました。以下のコードでは、x は「div」要素にバインドされています

reader.onloadend = function (evt) {
    x.innerHTML = evt.target.result;
}

「onload」では、すべて未定義でした。

于 2013-01-23T16:25:56.923 に答える