Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的文件阅读器包裹在一个无限循环的承诺中?_Javascript_Loops_Promise_Filereader - Fatal编程技术网

Javascript 为什么我的文件阅读器包裹在一个无限循环的承诺中?

Javascript 为什么我的文件阅读器包裹在一个无限循环的承诺中?,javascript,loops,promise,filereader,Javascript,Loops,Promise,Filereader,我正在尝试使用文件读取器读取serviceWorker中的一个大文件。我只想先建立一个简单的例子,但我陷入了一个无限循环,我不明白为什么。这是我的密码: .then(function(blob) { console.log("Let's loop out of control"); function compressAndIndexFile(my_blob) { var file_reader = new 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字节后停止循环,它在第二次迭代后正确触发,并解决了承诺。然而,循环只是继续被遗忘

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

试试看:

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

我从未使用过promises,但看起来每次都会发生递归调用,即使在解释器启动后也是如此。

您需要在resolve/reject
resolve
后返回,因为resolve不会停止您的递归OK。让我看看回报是否有用。哈,是的。我不知道。谢谢。给我一个答案,这样我就可以检查了?