2017-01-31 10 views
0

Я пытаюсь прочитать большой файл внутри serviceWorker с помощью fileReader. Я просто хочу сначала создать простой пример, но я застрял в бесконечном цикле, и я не понимаю, почему. Вот мой код:Почему мой файлReader, завернутый в 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

Try:

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

Я никогда не использовал обещание, но это выглядит как рекурсивный вызов происходит каждый раз, даже после того, как разрешение увольняют.