2017-01-31 3 views
0

fileReaderを使用してserviceWorker内の大きなファイルを読み取ろうとしています。私はちょうど簡単な例を最初にセットアップしたいのですが、私は無限ループに詰め込まれており、なぜそれが理解できません。ここに私のコードは次のとおりです。私のfileReaderがPromiseでラップされて無限にループしているのはなぜですか?

.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バイトの後にループを停止しようと、それは正確に2回目の繰り返しの後にトリガし、約束を解決します。しかし、ループは忘却に繋がります。

質問:私は今、私が間違ってやっているかと思っしばらくの間、この上に座ってる
。たぶん誰か他の人がアイデアを持っています。ありがとう!

+1

解決/拒否の後に復帰が必要 – rickythefox

+1

'resolve'が再帰を停止しない –

+0

ok。リターンが役立つかどうかを見てみましょう。ハ、そうです。それは知らなかった。ありがとう。それを答えさせて、私は確認することができますか? – frequent

答えて

1

試してみてください。

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

私は約束を使用したことがありませんが、再帰呼び出しは、解像度が発射された後も毎回起こっているように見えます。

関連する問題