Ho chiamato l'API FileReader all'interno di un ciclo for per scorrere più oggetti file. Sto usando FileReader essenzialmente per visualizzare l'anteprima delle immagini.Come implementare la barra di avanzamento e le callback con la natura asincrona del 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
}
Sono di fronte a due problemi a causa della natura asincrona dell'API FileReader. Innanzitutto, l'evento onprogress
si attiva per ogni istanza di FileReader. Questo mi dà progressi per ogni file. Considerando che, ho intenzione di visualizzare il progresso totale per tutti i file anziché singoli file.
In secondo luogo, voglio eseguire azioni che devono essere eseguite solo quando tutte le istanze (una per ciascun file) di FileReader sono state completate. Attualmente, dal momento che FileReader funziona in modo asincrono, le azioni vengono eseguite prima che FileReader completi l'attività. Ho cercato molto e ancora imbattersi in una soluzione per questi problemi. Qualsiasi aiuto è apprezzato.
Solo pochi minuti fa ho implementato questa stessa soluzione e sono tornato a questa domanda per scoprire che è successo suggerire esattamente ciò che ho implementato. Per il progresso non ho bisogno di valori granulari. Così ho finito per calcolare il progresso come 'var progress = parseInt (((loaded/totalNumberOfFiles) * 100), 10);'. Grazie per l'aiuto. – John
ottimo, speriamo che questo possa aiutare anche altri. – undefined