Bonsoir !
Oui le titre est un peu compliqué mais je suis bloqué sur ce problème depuis 2 jours…
J’ai une classe Storage
qui me permet d’accéder aux informations d’un fichier via une méthode _getFile()
que voici :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | static _getFile(url, stats) { return new Promise((resolve, reject) => { const path = _path.join(Storage.root, url); const path_parsed = _path.parse(path); db.File.findOne({where: {path: path}, include: ['owner', 'group']}) .then(file => { file.type = 'file'; file.url = Storage.url + url; file.base = path_parsed.base; file.name = path_parsed.name; file.ext = path_parsed.ext; file.size = stats.size; file.mime = mime.lookup(path_parsed.ext); console.log('File ready'); return resolve(file); }) .catch(err => { return reject(err); }); }); }; |
Et une autre qui fait la même mais pour un dossier (pas besoin d’appel à une base de donnée) :
1 2 3 4 5 6 7 8 9 10 11 12 13 | static _getDirectory(url) { return new Promise(resolve => { const path = _path.join(Storage.root, url); console.log('Directory ready'); return resolve({ type: 'directory', name: _path.basename(path), url: Storage.url + '/' + url, path: path, }); }); }; |
Si une requête réclamant un fichier est reçue, la première méthode est utilisé, tout fonctionne bien. Si par contre une requête réclame un dossier, c’est là où ça se complique car il me faut créer l’arborescence de ce dossier. Voici la méthode qui s’en charge :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | static _getDirectoryTree(url) { return new Promise(resolve => { Storage._getDirectory(url) .then(dir => { dir.children = {}; Storage._safeReadDir(dir.path) .then(dirData => { if (dirData !== null) { dir.children = dirData.map(child => { const child_url = url + '/' + child; Storage._getStats(child_url) .then(stats => { if (stats.isDirectory()) { Storage._getDirectory(child_url) .then(directory => directory); } else { Storage._getFile(child_url, stats) .then(file => file); } }); }); // endmap } // endif }) .then(() => { console.log('returning the dir'); return resolve(dir); }); }); }); }; |
Je suis désolé pour le code un peu long et complexe, j’ai essayé de le simplifier au maximum… Comme vous pouvez le voir, il y a plusieurs console.log()
qui me permet de savoir à quel moment les méthodes sont exécutées. Voici ce que j’obtiens :
1 2 3 4 5 | Directory ready returning the dir Directory ready Directory ready File ready |
Ce qui n’est évidemment pas dans le bon ordre. Ça signifie que la méthode _getTreeDirectory
renvoie le résultant avant que la méthode map
est fini son travail, ce qui n’est pas bon ! Je sais que la solution va se trouver au niveau de Promise.all()
mais je n’arrive pas à l’utiliser… J’ai fait un gist avec toute la classe dedans pour que ce soit plus clair.
Merci d’avoir tout lu et bonne soirée !