【问题标题】:Why is my fileReader wrapped in a Promise looping into infinity?为什么我的 fileReader 被包裹在一个循环到无穷大的 Promise 中?
【发布时间】:2017-01-31 22:00:37
【问题描述】:

我正在尝试使用 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 字节后停止循环,它在第二次迭代后正确触发并解决了承诺。然而,循环只是继续被遗忘。

问题:
我在这上面坐了一会儿,现在想知道我做错了什么。也许其他人有一个想法。谢谢!

【问题讨论】:

  • 解决/拒绝后需要退货
  • resolve 不会停止你的递归
  • 好的。让我看看退货是否有帮助。哈,确实如此。我不知道。谢谢。让它成为答案,以便我检查?

标签: javascript loops promise filereader


【解决方案1】:

试试:

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

我从未使用过 Promise,但似乎每次都发生递归调用,即使在触发解决方案之后也是如此。

【讨论】:

    猜你喜欢
    • 2020-09-16
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2012-01-25
    相关资源
    最近更新 更多