2016-06-09 3 views
0

Я использую readAsDataURL для преобразования блоков в base64. Проблема заключается в том, что я делаю, что в цикле:Пропустить аргумент в функцию onloadend FileReader

var reader = new FileReader(); 

for(var index in objects){ 
    reader.readAsDataURL(objects[index].blob); 
} 

reader.onloadend = function() { 
    // need to pass my index here 
    objects[index].base64 = reader.result; 
} 

Итак, мой первый вопрос я могу использовать тот же считыватель для всех моих сгустков? И если да, то как я могу передать индекс в мою функцию onloadend?

Если я не могу использовать одного и того же читателя, как мне это сделать, чтобы решить эту проблему?

ответ

0

Теперь, я признаю, что мой ответ был написан довольно быстро, поскольку мой ноутбук умирает, но я считаю, что приведенный ниже код должен решить вашу проблему.

function readAllBlobs(objects, callback) { 
    var index = 0; 
    var reader = new FileReader(); 

    function readBlob(object) { 
     reader.readAsDataURL(object.blob); 
    } 

    var readBlobHandler = function() { 
     // the index is available here. 
     objects[index].base64 = reader.result; 

     index++; 
     if (index == objects.length) { 
      // all objects have been read, fire callback on mutated objects array. 
      callback(objects); 
      return; 
     } 

     readBlob(objects[index]); 
    } 

    reader.onload = readBlobHandler; 

    readBlob(objects[index]); 
} 

Я думал, что вы можете написать функцию, которая принимает ваш массив объектов blob и обратный вызов. Функция использует один FileReader с обработчиком onload, который постоянно увеличивает индекс и читает следующий объект в массиве, который был передан. Индекс всегда доступен, так как эта логика выполняется в закрытии, а не в цикле for. После того, как индекс был увеличен до той же длины, что и массив объектов, который был передан, ваш обратный вызов выполняется с использованием массива мутированных объектов, переданного в качестве параметра. Этот обратный вызов должен содержать логику, которую вы хотите выполнить, как только все капли были преобразованы в base64.

Надеюсь, это поможет!

+1

Я нашел это очень приятное решение: http://stackoverflow.com/questions/4404361/html5-file-api-get-file-object-within-filereader-callback?rq=1 – ncohen

Смежные вопросы