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 ?
Version imprimable
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 ?
Bonjour,
Ce lien devrait répondre à tes questions ;)
merci arthur57 !!! je commence à voir plus clair !!!
Bon je rame un peu.
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 ? :weird:Code:
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 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.
J'ai peut être mal saisi le rôle de cette fonction end()Citation:
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
Citation:
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
Bon, j'avance à petit pas, pas simple quand on viens du C++ :aie:
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).
merci Marco !! ;)
donc le chaînage de promesses permet de capturer les throw avec un .catch() ?!?!
Oui regarde les exemples de la MDN.
merci et j'ai trouvé ça aussi : https://codeburst.io/node-js-mysql-a...s-4c3be599909b
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:
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:
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... } };
et pour appuyer mon dernier post : https://blog.xebia.fr/2017/11/14/asy...en-javascript/