construire un arbre avec data asynchrone en récursif

construire un arbre avec data asynchrone en récursif - Javascript/Node.js - Programmation

Marsh Posté le 22-03-2021 à 07:19:26    

Hello
 
Je galère un peu avec un petit programme que j'essaie d'écrire en javascript (nodeJS) pour imprimer un "arbre" qui s'apparente à une structure de dossiers/fichiers.
Cette structure est stockée en base de donnée (mySQL).
 
J'ai une table avec ces champs :
- id
- name
- type (file ou folder. Quand c'est un folder : je veux aller chercher les sous-folders et sous-fichiers).
- parent_id
 
Je ne peux pas sortir toute la table d'un coup (trop d'entrées). J'essaie donc de faire ça récursivement. (Dans mon application, je ne commencerai pas avec level=0, mais à partir d'un sous-niveau donné par ailleurs)
 
 
Voici ce que j'ai pour l'instant ("db" est juste un objet qui se connecte à ma base) :

Code :
  1. function getFileInformation(db,parent_id) {
  2. return new Promise(function(resolve,reject) {
  3.  db.query(
  4.   'select * from files where parent_id=? ',
  5.   [parent_id],
  6.   function (err, rows, fields) {
  7.    if(err!==null) console.log(err);
  8.    resolve(JSON.parse(JSON.stringify(rows)));
  9.   }
  10.  );
  11. });
  12. }
  13. function parseTree(db,parent_id,level) {
  14. return new Promise(function(resolve,reject) {
  15.  let output="";
  16.  getFileInformation(db,parent_id)
  17.  .then(function(rows) {
  18.   for(let i=0;i<rows.length;i++) {
  19.    //indent
  20.    for(let j=0;j<level;j++) output+=' ';
  21.    output+=rows[i].name+"\n";
  22.    if(rows[i].type=='folder') {
  23.     parseTree(db,rows[i].id,level+1)
  24.     .then(function(out) {
  25.      output+=out;
  26.     });
  27.    }
  28.   }
  29.   resolve(output);
  30.  });
  31. });
  32. }
  33. parseTree(db,0,1)
  34. .then(function(out) {
  35. console.log(out);
  36. });


 
Quand je lance ce code, ça ne m'imprime que le niveau 0. Ca semble descendre dans les sous-niveaux, mais ça ne retourne rien dans mes variables out/output.
 
(je suis un peu noob en JS, et pas bien à l'aise avec la syntax async/await, etc).
 
Merci !

Reply

Marsh Posté le 22-03-2021 à 07:19:26   

Reply

Marsh Posté le 22-03-2021 à 18:33:19    

Hum deja habituellement on definit toujours un id commun (genre root_id), ca permet d'éviter de faire du recursif sur la BDD. Parce que la ca va te peter a la tronche si il y a un peu d'id dedans :D

Reply

Marsh Posté le 22-03-2021 à 19:29:47    

Dans l'idée, je l'appelle toujours pour un ID donné. Jamais à partir de 0, sinon, effectivement je descend toute la table et ça va flinguer les perfs.

 

Je me suis inspiré de ce lien : https://bl.ocks.org/magnetikonline/ [...] c876b9aef4 et j'ai obtenu quelque chose qui fait ce que je veux.

 

Le code est super long, et je dois tout réordonner à la fin (pour que les children s'affichent juste après leur parent)  mais ça finit par faire ce que je veux.

 

Ouf !

 

PS : si vous avez une version plus courte, je prends :)

 

:jap:


Message édité par nabbo le 30-03-2021 à 22:24:18
Reply

Marsh Posté le 30-03-2021 à 20:25:19    

Tu peux regarder la représentation intervallaire pour modéliser ton arbo. C'est adapté quand tu fais bien plus de lecture que de modification de l'arbo.
https://sqlpro.developpez.com/cours/arborescence/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-03-2021 à 22:24:04    

rufo a écrit :

Tu peux regarder la représentation intervallaire pour modéliser ton arbo. C'est adapté quand tu fais bien plus de lecture que de modification de l'arbo.
https://sqlpro.developpez.com/cours/arborescence/


 
dans mon use-case ici, j'ai pas la main pour modifier la base de données.  
 
:jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed