2014-12-18 1 views
0

Я пытаюсь использовать filereader для чтения данных из нескольких файлов в массиве. Но есть ошибка, говорящая, что объект уже занят чтением Blobs.FileReader JS throws Объект занят чтением blobs

    flag = 1; 
        var file; 
        var fileRead = []; 
        for (var i = 0, f; f = changeEvent.target.files[i]; i++) { 
         reader.onload = function(loadEvent) { 
          scope.$apply(function() { 
           if (flag == 1) { 
            fileRead.push(loadEvent.target.result); 

           } 
          }); 
         }; 

         reader.readAsDataURL(f); 
        } 

        for (i = 0; i < changeEvent.target.files.length; i++) { 
         file = changeEvent.target.files[i]; 
         fileName.push(file.name); 
        } 
       } 
      } 

Я попытался использовать цикл, чтобы убедиться, что эта операция выполнена, но она заканчивается бесконечным циклом.

+0

должен быть '' reader.onloadend вместо 'reader.onload' – juvian

+0

пытался это тоже. это не имеет никакого значения. –

+1

Вы вызываете 'reader.readAsDataURL (f);' прежде чем он сможет закончить предыдущий файл. 'readAsDataURL' ** является асинхронным **. Почему, по-вашему, вы должны предоставить обработчик события 'load'? Вы в основном говорите «читателю» для чтения файлов «n» сразу. –

ответ

1

Вам нужно дождаться, когда читатель закончит чтение, filereader будет асинхронным, так что вы не можете сделать это в for. Не пробовал, но вот как это делается:

function readFiles() { 
    if (changeEvent.target.files.length > 0) { // if we still have files left 
     var file = changeEvent.target.files.shift(); // remove first from queue and store in file 

     reader.onloadend = function (loadEvent) { // when finished reading file, call recursive readFiles function 
      fileRead.push(loadEvent.target.result); 
      readFiles(); 
     } 
     reader.readAsDataURL(file); 

    } else { 
     finishedReadingFiles() // no more files to read 
    } 
} 
readFiles(); 
0

Вот фрагмент того, что сработало для меня. readAsDataURL является асинхронным, поэтому вам нужно дождаться, когда файл будет прочитан, прежде чем работать над следующим. Убедитесь, что вы читаете читателя в цикле.

 var files = e.target.files; 

     if(files) { 
     for (let i = 0, f; f = files[i]; i++) { 
      var reader = new FileReader(); 
      reader.onloadend = function(output){ 
       console.log('output', output.target.result) 
       console.log('fileNamnes', f.name) 
      }.bind(this); 
      reader.readAsDataURL(f) 
     } 
     } 
Смежные вопросы