J'ai un objet avec des instances File
imbriquées dans divers emplacements. Je voudrais parcourir récursivement l'objet, vérifier si un objet est un instanceof File
, utiliser une promesse de créer une URL de données à partir de l'instance, et résoudre la promesse uniquement lorsque toutes les promesses ont été résolues.Résoudre des promesses de nombres imbriquées dans un objet
J'ai une fonction existante qui renvoie une promesse et qui se résout lorsque l'URL de données du fichier est prête.
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);
}
})
}
J'ai une fonction récursive de regarder pour un File
dans l'objet.
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;
}
Je veux garder la structure existante de l'objet passé (values
) et remplacer uniquement les instances de fichiers avec la chaîne base64. Je connais aussi Promise.all
mais je ne sais pas comment l'utiliser dans ce contexte.
Comment puis-je revenir convertPhotosToBase64
comme une promesse qui résout quand tous des fichiers ont été convertis en chaînes de base64?
[ 'Promise.all'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) – 4castle
Comment serait J'utilise 'Promise.all' dans cette ins tance? Je suis conscient que 'Promise.all' existe. – Himmel
Vous créez un tableau de promesses puis 'return Promise.all (promiseArray)' depuis votre gestionnaire interne '.then()'. – jfriend00