У меня есть объект с вложенными File
экземплярами в разных местах. Я хотел бы рекурсивно пройти через объект, проверить, является ли объект instanceof File
, использовать обещание создать URL-адрес данных из экземпляра и разрешить обещание только тогда, когда все обещания были разрешены.Разрешить любое число обещаний, вложенных внутри объекта
У меня есть существующие функции, которые возвращают Promise и решает, когда URL-адрес данных из файла будет готов.
export const parsePhoto = (file) => {
return new Promise((resolve, reject) => {
const reader = new FileReader();
try {
reader.readAsDataURL(file);
reader.onloadend =() => {
return resolve(reader.result);
}
} catch(e) {
console.warn('Could not upload photo', e.target);
}
})
}
У меня есть функция рекурсивно искать для File
в объекте.
export const convertPhotosToBase64 = (values) => {
if (!values) return values;
const converted = Object.keys(values).reduce((acc, key) => {
if (values[key] instanceof File) {
// Do something here
acc[key] = parsePhoto(values[key]);
}
if (isArray(values[key])) {
acc[key] = values[key].map(value => {
if (typeof value === 'object' && !isArray(value)) {
return convertPhotosToBase64(value);
}
return value;
})
}
// Recurse if object
if (typeof values[key] === 'object' && !isArray(values[key])) {
acc[key] = convertPhotosToBase64(values[key]);
}
return acc;
}, values);
return converted;
}
Я хочу, чтобы сохранить существующую структуру объекта, переданного (values
) и заменить только экземпляры файлов со строкой base64.
Я также знаю Promise.all
, но не знаю, как его использовать в этом контексте.
Как я могу вернуть convertPhotosToBase64
как обещание, устраняющее когда все файлы были преобразованы в base64 строки?
[ 'Promise.all'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) – 4castle
Как бы Я использую 'Promise.all' в этом стояние? Я знаю, что 'Promise.all' существует. – Himmel
Вы создаете массив обещаний, а затем 'возвращаете Promise.all (promarray)' из вашего внутреннего обработчика '.then()'. – jfriend00