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。脚本的目标是读取两个 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

我有一个类似的问题,它通过使用“.onloadend”而不是“onload”解决了文件读取等待。在下面的代码中,x 绑定到一个“div”元素

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

使用“onload”,这一切都是未定义的。

于 2013-01-23T16:25:56.923 回答