Я пишу какое-то приложение для чтения выбранных файлов пользователем и преобразования их в base64. Я хочу получить уведомление, когда все файлы будут прочитаны в памяти. Для этого я использую Observable
, где обрабатывают событие onload
FileReader
и отправляют полное уведомление. Я использую forkJoin
для параллельной работы.Чтение файлов параллельно наблюдаемым
См. Ниже код, где я создаю Observable
и подписывается на него.
onChange($event: any) {
console.log('No of files selected: ' + $event.target.files.length);
var observableBatch : any = [];
var rawFiles = $event.target.files;
for (var i = rawFiles.length - 1; i >= 0; i--) {
var reader = new FileReader();
var file = rawFiles[i];
var myobservable = Observable.create((observer: any) => {
reader.onload = function (e: any) {
var data = e.target;
var imageSrc = data.result;
console.log('File loaded succesfully.');
observer.next("File loaded");
observer.complete();
};
});
observableBatch.push(myobservable);
reader.readAsArrayBuffer(file);
}
Observable.forkJoin(observableBatch)
.subscribe(
(m) => {
console.log(m);
},
(e) => {
console.log(e);
},
() => {
console.log("All file(s) loading completed!!!");
}
);
}
Полный пример кода доступен в plunkr
Когда я выбираю один файл, onload
функция выполняется, и я получаю следующие журналы консольных
Однако, когда я выбираю несколько файлов, onload
выполняется только один раз, и пакетная операция не завершена. Пожалуйста, смотрите следующие журналы консоли
Может кто-нибудь помочь мне понять, где я делаю ошибку?
Не работает для меня! –
новый FileReader (файл) неверен, поскольку FileReader не принимает аргумент для создания экземпляра. –