Теперь, я признаю, что мой ответ был написан довольно быстро, поскольку мой ноутбук умирает, но я считаю, что приведенный ниже код должен решить вашу проблему.
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.
Надеюсь, это поможет!
Я нашел это очень приятное решение: http://stackoverflow.com/questions/4404361/html5-file-api-get-file-object-within-filereader-callback?rq=1 – ncohen