IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NodeJS Discussion :

Construire un arbre avec data asynchrone en récursif


Sujet :

NodeJS

  1. #1
    Nouveau membre du Club
    Profil pro
    nabbo
    Inscrit en
    Décembre 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : nabbo

    Informations forums :
    Inscription : Décembre 2005
    Messages : 35
    Points : 25
    Points
    25
    Par défaut Construire un arbre avec data asynchrone en récursif
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    34
    35
    36
    37
     
        function getFileInformation(db,parent_id) {
        return new Promise(function(resolve,reject) {
         db.query(
          'select * from files where parent_id=? ',
          [parent_id],
          function (err, rows, fields) {
           if(err!==null) console.log(err);
           resolve(JSON.parse(JSON.stringify(rows)));
          }
         );
        });
        }
        function parseTree(db,parent_id,level) {
        return new Promise(function(resolve,reject) {
         let output="";
         getFileInformation(db,parent_id)
         .then(function(rows) {
          for(let i=0;i<rows.length;i++) {
           //indent
           for(let j=0;j<level;j++) output+=' ';
           output+=rows[i].name+"\n";
           if(rows[i].type=='folder') {
            parseTree(db,rows[i].id,level+1)
            .then(function(out) {
             output+=out;
            });
           }
          }
          resolve(output);
         });
        });
        }
        parseTree(db,0,1)
        .then(function(out) {
        console.log(out);
        });

    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 !

  2. #2
    Membre habitué
    Homme Profil pro
    Etudiant
    Inscrit en
    Février 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 115
    Points : 139
    Points
    139
    Par défaut
    Salut,

    déjà tu as une erreur dans ta fonction getFileInformation() qui devrait reject() en cas d'erreur.
    Ensuite, tu ne peux pas faire de boucle (synchrone) et appeler du code asynchrone à l'intérieur (c'est une erreur classique des débutants NodeJS)
    Si tu veux faire du recursif asynchrone je pense que c'est plus simple en async/await mais si tu veux t'en tenir aux promesses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function recursive(i) {
        return new Promise((resolve, reject) => {
            console.log(i);
            if (i === 10) {
                return resolve(i);
            } else {
                return resolve(recursive(++i));
            }
        });
    }
    recursive(0).then(() => console.log('done'));
    Pour les boucles asynchrones :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function loop() {
        return [0, 0, 0].map(i => recursive(i)); // return un tableau de Promise
    }
     
    // Resouds un tableau de Promise
    Promise.all(loop()).then((array) => console.log(array));
    Et pour avoir un truc plus clean, je te conseille de séparer la récupération de ta structure en mémoire et l'affichage de celle-ci

Discussions similaires

  1. Construire un arbre avec des paires père-fils
    Par Lorenzaccio dans le forum Général Java
    Réponses: 0
    Dernier message: 10/09/2015, 19h11
  2. Réponses: 3
    Dernier message: 16/05/2012, 23h36
  3. construire un arbre n-aire
    Par emidelphi77 dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2005, 18h47
  4. [LG] Arbre avec pascal
    Par mondanikoffi dans le forum Langage
    Réponses: 1
    Dernier message: 21/07/2005, 13h36
  5. construire 1 gateway avec 1 carte réseaux sous débian
    Par regular dans le forum Développement
    Réponses: 4
    Dernier message: 28/08/2003, 01h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo