У меня есть API FileReader, вызываемый в цикле for для перебора нескольких файловых объектов. Я использую FileReader для предварительного просмотра изображений.
function() {
for (var i in Files) {
var fileReader = new FileReader();
fileReader.readAsBinaryString(Files[i]);
fileReader.onload = function() {
// do something on FileReader onload
}
fileReader.onprogress = function(data) {
if (data.lengthComputable) {
var progress = parseInt( ((data.loaded / data.total) * 100), 10 );
console.log(progress);
}
}
}
// do something on completion of FileReader process
// actions here run before completion of FileReader
}
Я столкнулся с двумя проблемами из-за асинхронного характера API FileReader. Во-первых, событие onprogress
запускается для каждого экземпляра FileReader. Это дает мне прогресс для каждого файла. Принимая во внимание, что я намерен отображать общий прогресс для всех файлов, а не для отдельных файлов.
Во-вторых, я хочу выполнять действия, которые должны выполняться только после завершения всех экземпляров (по одному для каждого файла) FileReader. В настоящее время, поскольку FileReader работает асинхронно, действия выполняются до того, как FileReader завершит свою задачу. Я много искал, но пока не нашел решения этих проблем. Любая помощь приветствуется.
parseInt
для чисел является анти-шаблоном. Если вы хотите округлить (или обрезать) значение(data.loaded / data.total) * 100
, используйтеMath.round
илиMath.floor
. Вы также можете сначала выполнить часть* 100
, чтобы промежуточное значение не было таким уж маленьким (поскольку это может помочь предотвратить потерю точности):var progress = Math.round((data.loaded * 100) / data.total);
- person T.J. Crowder   schedule 17.11.2020