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 :

Appels synchrones & asynchrones


Sujet :

NodeJS

  1. #1
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut Appels synchrones & asynchrones
    Salut !

    Je me demande, en général, comment identifie t'on si l'appel d'une fonction d'un module se fait de manière synchrone ou asynchrone ?
    Ubuntu fan depuis la 8.04
    monnaie libre

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 219
    Points : 336
    Points
    336
    Par défaut
    Bonjour,

    Ce lien devrait répondre à tes questions
    Si débugger est l'art de corriger les bugs, alors programmer est l'art d'en créer.

  3. #3
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut
    merci arthur57 !!! je commence à voir plus clair !!!
    Ubuntu fan depuis la 8.04
    monnaie libre

  4. #4
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut
    Bon je rame un peu.

    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
    function check_login(json_, socket_)
    {
      let con = mysql.createConnection(options);
     
      con.on('error', function(error_)
      {
        console.error("connection error ", error_);
      });
     
      con.connect(function(error_)
      {
        if(error_)
          console.log("connect error : ", error_);
      });
     
      let query = "SELECT count(*) as num FROM user";
     
      console.log("query : ", query);
     
      con.query(query, function(error_, result_, fields_)
      {
        if(error_)
        {
          console.error("query error ", error_.code);
          return;
        }
     
        const count = result_[0].num;
      });
     
      con.end();
    };
    je n'ai pas de garantie d'avoir le résultat de ma requete à la fin de ma fonction... donc je génère un événement ? ou alors je place des await ?
    Ubuntu fan depuis la 8.04
    monnaie libre

  5. #5
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Je ne connais pas cette API mais de ce que je comprends du code et de comment il s'organise tu as de grandes chances de fermer ta connexion avant même d'avoir reçu le résultat de ta requête.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  6. #6
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut
    Terminating connections

    There are two ways to end a connection. Terminating a connection gracefully is done by calling the end() method:

    connection.end(function(err) {
    // The connection is terminated now
    });

    This will make sure all previously enqueued queries are still before sending a COM_QUIT packet to the MySQL server. If a fatal error occurs before the COM_QUIT packet can be sent, an err argument will be provided to the callback, but the connection will be terminated regardless of that.

    source : https://github.com/mysqljs/mysql#ter...ng-connections
    J'ai peut être mal saisi le rôle de cette fonction end()

    Every method you invoke on a connection is queued and executed in sequence.
    Closing the connection is done using end() which makes sure all remaining queries are executed before sending a quit packet to the mysql server.

    source : https://github.com/mysqljs/mysql#introduction
    Ubuntu fan depuis la 8.04
    monnaie libre

  7. #7
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut
    Bon, j'avance à petit pas, pas simple quand on viens du C++
    Ubuntu fan depuis la 8.04
    monnaie libre

  8. #8
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Ok, j'ai rien dit, la fonction end attends la fin de l'exécution de toutes les requêtes en attente

    Pour ta problématique initiale, il s'agit en fait de savoir comment récupérer la valeur de count dans l'appelant si je comprends bien ?

    Premier point, la connexion devrait être ouverte et fermée en dehors de cette fonction. Généralement on ouvre la connexion à la base de données au démarrage de l'appli et on la ferme lors de la fermeture de l'appli. On n'exécute pas ouverture / fermeture de connexion à chaque requête c'est bien trop couteux.

    Ta connexion active doit donc être injectée à la fonction implémentant la requête.

    Comme le but est de retourner à l'appelant de ta fonction la valeur ramenée par la requête et qu'on est dans un contexte asynchrone il te faut utiliser les promesses. Ta fonction doit retourner une promesse qui "résout" le résultat de la base donnée dans le callback de la fonction query de ta connexion active.

    Je t'invite dans l'immédiat à ignorer async / await et à commencer à travailler avec les promesses. C'est la brique de base pour travailler sur de l'asynchrone en JavaScript (client ou serveur), cela fait partie intégrante de la norme ES2015 et c'est donc disponible en natif dans Node.js depuis un certain temps, ce n'est pas documenté par l'API node car ce n'est pas fourni par l'API node mais par le langage JavaScript lui-même (par le moteur d'exécution V8 en fait).
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  9. #9
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut
    merci Marco !!
    Ubuntu fan depuis la 8.04
    monnaie libre

  10. #10
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut
    donc le chaînage de promesses permet de capturer les throw avec un .catch() ?!?!
    Ubuntu fan depuis la 8.04
    monnaie libre

  11. #11
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Oui regarde les exemples de la MDN.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  12. #12
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut
    merci et j'ai trouvé ça aussi : https://codeburst.io/node-js-mysql-a...s-4c3be599909b
    Ubuntu fan depuis la 8.04
    monnaie libre

  13. #13
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut
    Bon, je maîtrise mieux les Promise mais pour une facilité d'écriture et de relecture de mon code j'opte pour une utilisation du couple async/await, exemple :

    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
     
    // mysql_tools //
    ////////////////////////////////////////////////////////////////////////////////
    function query(sql_, args_)
    {
      return new Promise(function(resolve_, reject_)
      {
        mysql_connection.query(sql_, args_, function(err_, rows_)
        {
          if(err_)
            return reject_(err_);
     
          resolve_(rows_);
        });
      });
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    async function demo()
    {
    try
    {
       let result = await mysql_tools.query("SELECT count(*) as num FROM truc");
    }
    catch(err_)
    {
      // ici on va "attrapper" un eventuel reject...
    }
     
    };
    Ubuntu fan depuis la 8.04
    monnaie libre

  14. #14
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut
    et pour appuyer mon dernier post : https://blog.xebia.fr/2017/11/14/asy...en-javascript/
    Ubuntu fan depuis la 8.04
    monnaie libre

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

Discussions similaires

  1. Remote Procedure Call - Appel Synchrone
    Par gufra dans le forum GWT et Vaadin
    Réponses: 16
    Dernier message: 07/08/2008, 17h23
  2. [Séquence] Messages synchrones/asynchrones
    Par infofree dans le forum Autres Diagrammes
    Réponses: 15
    Dernier message: 04/04/2008, 09h42
  3. Appel synchrone de callback
    Par lantier dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 13/01/2008, 20h33
  4. fonction synchrone asynchrone
    Par akrlot dans le forum C
    Réponses: 12
    Dernier message: 28/09/2007, 14h34
  5. Replication synchrone/asynchrone avec Oracle 8i
    Par Fraise des Bois dans le forum Oracle
    Réponses: 1
    Dernier message: 11/01/2006, 21h24

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