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 :

Valeur undefined en retour de fonction


Sujet :

NodeJS

  1. #1
    Membre habitué Avatar de bidochon
    Inscrit en
    Juin 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 168
    Points : 156
    Points
    156
    Par défaut Valeur undefined en retour de fonction
    Bonjour

    j'ai un petit souci de syntaxe sur l’écriture d'une fonction en JS, le retour de la function est toujours à undefined

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var fs = require('fs');
     
    function listFolder(path){
        let a=[];
        fs.readdir(path, function(err, files) {
            if (err) {
                return console.log('Error scanning directory: ' + err);
            }
            files.forEach(function (file) {
                a.push(file);
            })
        return a
        })
    }
    Merci d'avance pour vos conseils éclairés
    Tant de mains pour transformer ce monde, et si peu de regards pour le contempler !
    (Julien Gracq)

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 946
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 946
    Points : 44 086
    Points
    44 086
    Par défaut
    Bonjour,
    lorsque tu appelles ta fonction listFolder celle-ci appelle la méthode readdir qui elle est asynchrone ce qui fait que son résultat n'est pas disponible au moment où la fonction listFolder ce termine.

    Mets des console.log dans ton code pour t'en rendre compte
    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
    var fs = require('fs');
     
    function listFolder(path) {
      let a = [];
      fs.readdir(path, function(err, files) {
        if (err) {
          return console.log('Error scanning directory: ' + err);
        }
        files.forEach(function(file) {
          a.push(file);
        })
        console.log("Fin appel fs.readdir\n", a);
        return a
      })
      console.log("Fin function listFolder");
    }
    listFolder(__dirname);

  3. #3
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    J'aimerais ajouter une remarque à la réponse de NoSmoking...

    Citation Envoyé par bidochon Voir le message
    j'ai un petit souci de syntaxe sur l’écriture d'une fonction en JS, le retour de la function est toujours à undefined
    Ben cela dépend de ce que tu veux dire : le retour de quelle fonction ???

    1- Si tu veux parler de la fonction listFolder :

    Eh bien cette fonction ne retourne rien (---> il n'y a pas de return lui correspondant)* donc si par exemple tu fais : var res = listFolder(__dirname); alors res sera undefined, ce qui est normal puisque encore une fois la fonction ne retourne rien*...

    * Oui le return a ; ne correspond pas à la fonction listFolder, elle correspond à la fonction de rappel anonyme qui est passée en paramètre de la fonction readdir...

    2- Si tu veux parler de la fonction qui est passée en paramètre de la fonction readdir et à laquelle le return a ; correspond eh bien celle-ci ne retourne pas undefined (car la variable a est toujours définie et même rempli par les noms des fichiers si il y en a).

    Je suppose donc que tu dois être dans le premier cas puisque tu as toujours undefined...

    ---> Ainsi si tu es dans le premier cas cela répond à ta question : si tu as toujours undefined c'est parce que la fonction ne retourne rien (il n'y a pas de return lui correspondant)...

    ---> Même si tu rajoutes un autre return a ; cette fois-ci correspondant à la fonction listFolder (c'est d'ailleurs peut-être ce que tu voulais faire) eh bien cette dernière ne retournera pas non plus undefined, elle devrait retourner un tableau vide ("vide" car il a été initialisé comme cela let a = []; et qu'il n'a pas (encore) été rempli à cause du problème expliqué par NoSmoking...).

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 946
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 946
    Points : 44 086
    Points
    44 086
    Par défaut
    Effectivement on est dans la même situation qu'avec une requête Ajax, voir cette discussion.

  5. #5
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Exact, c'est le même genre de problème...

  6. #6
    Membre habitué Avatar de bidochon
    Inscrit en
    Juin 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 168
    Points : 156
    Points
    156
    Par défaut
    Bonjour et merci à vous deux pour vos explications claires

    J'avais bien vu que les fonctions de 'fs' se déclinaient en synchrone et asynchrone, je m’étais même dit de rester vigilant à ce sujet...
    Il faut dire que mon niveau en Javascript est resté à l'ECMA 4.xx ( JScript de Microsoft ) et que je suis un peu perdu en lisant l'évolution de certaines syntaxes et du passage a la POO, mais bon je vais retrousser mes manches !

    Effectivement coder un retour dans le callback de la fonction asynchrone ... ce n’était pas vraiment malin de ma part et surtout cela revoyait une valeur absente au moment du retour
    Je comprends maintenant pourquoi j'avais un undefined, la variable a n'est pas definie dans le callback

    Merci du coup de main
    Tant de mains pour transformer ce monde, et si peu de regards pour le contempler !
    (Julien Gracq)

  7. #7
    Membre habitué Avatar de bidochon
    Inscrit en
    Juin 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 168
    Points : 156
    Points
    156
    Par défaut
    bon au final, cela donne tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function listFolder(path){
        let a=[],
        files = fs.readdirSync(path);
        for (var i in files) {
            a.push(files[i])
        }
        return a
    }
    Tant de mains pour transformer ce monde, et si peu de regards pour le contempler !
    (Julien Gracq)

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 946
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 946
    Points : 44 086
    Points
    44 086
    Par défaut
    Bouh !!! readdirSync t'es pas joueur

  9. #9
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Citation Envoyé par bidochon Voir le message
    Je comprends maintenant pourquoi j'avais un undefined, la variable a n'est pas definie dans le callback
    Je ne voudrais pas t'embrouiller mais ce n'est pas pour ça que tu as un "undefined", la variable a n'est effectivement pas déclarée dans la fonction de rappel mais elle n'est pas non plus "undefined" car elle a été déclarée et initialisée au début de la fonction listFolder...

    Pour te rendre compte de cela tu peux faire ça :

    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
    var fs = require('fs');
     
    function listFolder(path) {
      let a = ["Salut"];
      fs.readdir(path, function (err, files) {
        console.log("tableau a :", a); // ici on a bien accès au tableau "a"...
        if (err) {
          return console.log('Error scanning directory: ' + err);
        }
        files.forEach(function (file) {
          a.push(file);
        })
        return a
      })
    }
     
    listFolder(__dirname);
    J'ai mis la string "Salut" dans le tableau "a" pour qu'on puisse bien voir qu'on y a bel et bien accès dans la fonction de rappel...

    Mais le return a ; ne sert à rien ici puisque tu ne récupères pas la valeur retournée...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de comptage dans une fonction
    Par kev484 dans le forum Débuter
    Réponses: 4
    Dernier message: 18/09/2008, 12h57
  2. Probleme de syntaxe dans une boucle for
    Par spoker04 dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/09/2008, 10h12
  3. Probleme de calcule dans une fonction
    Par nuFox dans le forum C
    Réponses: 22
    Dernier message: 13/03/2008, 15h14
  4. [MySQL] probleme de syntaxe dans une requete sql
    Par jeanfrancois dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 28/03/2006, 10h54
  5. [JDBC]problème de syntaxe dans une requête en java...
    Par chti_juanito dans le forum JDBC
    Réponses: 60
    Dernier message: 04/11/2005, 16h47

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