У меня есть пустой массив, пока я регистрирую экземпляр массива!
onSelectMultipleImage = (event): Promise<any> => {
return new Promise(resolve => {
const files = <File[]>event.target.files;
let file: File;
let counter = -1;
const response = [];
while (file = files[++counter]) {
const reader: FileReader = new FileReader();
reader.onload = ((f) => {
return () => {
response.push({
file: f,
base64: reader.result
})
}
})(file);
reader.readAsDataURL(file);
console.info(counter);
if (counter == files.length -1) {
console.info('inside the while');
resolve(response);
}
}
});
};
onImagesSelect = async (event: Event) => {
this.newImages = await this.helper.onSelectMultipleImage(event) || [];
console.info(this.newImages, "Original"); // [file: File, base64: "base 64 long string..."]
console.info([...this.newImages],"instance"); // [] empty array
setTimeout(() => {console.info([...this.newImages, 'instance'])}, 2000); // [file: File, base64: "base 64 long string..."]
}
Итак, почему я получаю представленный результат? Это что-то вызвано base64, представленным внутри массива? если да, то какое решение?
Он не ждет reader.onload
завершения. Итак, resolve(response)
называется перед response.push
.
Вы можете создать обещание прочитать один файл и вернуть его с помощью Promise.all
, как в следующем коде.
readFile = (file: File): Promise<any> => {
return new Promise(resolve => {
const reader: FileReader = new FileReader();
reader.onload = (f) => {
resolve({
file: f,
base64: reader.result
});
};
reader.readAsDataURL(file);
})
}
onSelectMultipleImage = (event): Promise<any> => {
const files = <File[]>event.target.files;
return Promise.all(files.map(file => readFile(file)));
};