为什么我的fileReader包含在一个循环到无限的Promise中?

时间:2017-01-31 22:00:37

标签: javascript loops promise filereader

我尝试使用fileReader读取serviceWorker中的大文件。我只是想先设置一个简单的例子,但我陷入了无限循环,我不明白为什么。这是我的代码:

    .then(function(blob) {
        console.log("Let's loop out of control");

        function compressAndIndexFile(my_blob) {
          var file_reader = new FileReader(),
            chunk_size = 1024,
            offset = 0;
          return new Promise(function (resolve, reject) {
            file_reader.onload = function (my_event) {
              // process
              offset += chunk_size
              if (offset > 2048) {
                resolve("We're done");
              }
              return loopOverBlob(offset);
            };
            file_reader.onerror = function (my_event) {
              reject(my_event);
            };

            function loopOverBlob(my_offset) {
              var slice;
              console.log("LOOPIng")
              console.log(my_offset)
              slice = blob.slice(my_offset, my_offset += chunk_size);
              return file_reader.readAsText(slice);
            }
            return loopOverBlob(offset);
          });              
        }
        return compressAndIndexFile(blob);
      })

我尝试在2048字节后停止循环,并在第二次迭代后正确触发并解析承诺。然而,这个循环仍然被遗忘。

问题:
我坐了一会儿,现在想知道我做错了什么。也许别人有个主意。谢谢!

1 个答案:

答案 0 :(得分:1)

尝试:

if (offset > 2048) {
    resolve("We're done");
} else {
    return loopOverBlob(offset);
}

我从未使用过承诺,但看起来即使在解决了这个决议之后,每次都会发生递归调用。