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 :

Comprendre les Promises


Sujet :

NodeJS

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 22
    Par défaut Comprendre les Promises
    Bonjour à vous tous,
    Débutant en nodeJs, j'essayes de comprendre les Promises...
    Pourriez vous m'aider sur cette fonction : Les variables sont valides ("value[0]", "value[3]...[i]")
    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
     
    static RechCritUserById(value) {
    			return new Promise((resolve, reject) => {
     
    			for (var i = 0; i < value[3].length; i++) {
    				let ParId = value[3][i];
    				let UsrId = value[0];
    				console.log(' A : ', ParId)
    				var query_str = 'SELECT * FROM usr_par WHERE usr_id = ? AND par_id = ?';
    				var query_var = [UsrId, ParId];
    				connection.query(query_str, query_var, function (err, rows) {
    					if (err) {
    						return reject(err);
    					}
    					else {
    						if (rows.length != 0) {
    							console.log(' B ')
    							value.push(rows);
    						}
    						else {
    							console.log(' C ')
    							var trans = { up_id: '', usr_id: UsrId, par_id: ParId, up_val: 0 }
    							value.push(trans);
    						}
    					}
    				});
    			}
    			console.log(' D ')
    			resolve(value);
    		});
    	}
    Comme vous pouvez le voir j'ai place des "console.log" pour savoir ou j'en étais...
    Et comme résultat j'ai :

    A
    A
    A
    D
    B
    B
    C
    Le "D" qui est le "resolve" arrive trop tôt et donc "value" n'est pas incrémenté des nouvelles valeurs.
    Comment pourrais-je faire ?
    Merci de votre aise et temps.
    Acqua2b

  2. #2
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    ton resolve est placé apres la boucle for(...

    donc c'est logique, dès que cette boucle est terminé il y va !

    cette boucle envoit plusieurs fois une fonction asynchrone ( connection.query ) dont chaque instance prendra son temps utile, et qui ont peut de chance de s'achever avant l'éxécution totale de la dite boucle.

    J'ai l'impression que tu n'a pas vraiment intégré ce qu'est la logique asynchrone...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 22
    Par défaut
    Merci psychadelic de ta reponse.

    Effectivement je crois que j'ai besoin de me rafraichir la mémoire... Plus j'avance et moins je comprend...
    Asynchrone est non bloquant.
    Mais je pensais que la boucle "for" allait s'exécuter entièrement avant de sortir... et enfin résoudre (resolve)
    Je pensais faire du Sync.... Suis perdu !?
    Comment je peux faire pour parvenir à ce que je veux faire ?

    Merci de ton temps

  4. #4
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    et qu'est-ce que tu veux faire alors ?
    parce que ton code n'explique rien. un minimum d'explication en Français est nécessaire.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 22
    Par défaut
    Ok

    J'ai un tableau "value"qui contient des informations comme l'ID utilisateur courant (value[0])
    En "value[3]" il y a un tableau d'Identifiants de tous les paramètres présent dans ma table "parametres" de ma BDD.
    Je veux voir si tous ces paramètres sont renseignés pour l'utilisateur courant et les ajouter dans mon array (value)
    - si un paramètre n'est pas présent je l'ajoute dans "value[]" par défaut.

    Ensuite j'utilise "value[]" pour afficher les différentes informations dans ma page de vue (ejs)

    voila j'espère avoir été clair
    Merci

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 22
    Par défaut
    Je viens de faire d'une autre manière, en utilisant une boucle "while" et en supprimant "return new Promise" :

    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
    38
    39
    40
     
    static RechParamsUserByIdParams(value) {
     
    			let tableau = [];
    			let i = 0;
     
    			while (i < value[3].length) {
    				let ParId = value[3][i];
    				let UsrId = value[0];
    				console.log(' A : ', ParId)
    				var query_str = 'SELECT * FROM usr_par WHERE usr_id = ? AND par_id = ?';
    				var query_var = [UsrId, ParId];
    				connection.query(query_str, query_var, function (err, rows) {
    					if (err) {
    						console.log('Err ')						
    						return reject(err);
    					}
    					else {
    						if (rows.length != 0) {
    							console.log(' B ')
    							console.log('ROWS : ', rows[0])
    							tableau.push(rows[0]);
    						}
    						else {
    							console.log(' C ')
    							var cree = { up_id: '', usr_id: UsrId, par_id: ParId, up_val: 0 }
    							console.log('CREE : ', cree)
    							tableau.push(cree);
    						}
    					}
     
    				});
    				i++;
    			}
    			console.log(' D ')
    			value.push(tableau);
    			// console.log('Resolve RechCritUserById', value)
    			return value;
     
    	}
    Il m'affiche toujours :
    A
    A
    A
    D
    B
    B
    C
    Je pensais : tant que "i" est inférieur à "lenght" ont restais dans la boucle "while" !?

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

Discussions similaires

  1. quelques soucis avec word 2000
    Par ramchou dans le forum Word
    Réponses: 3
    Dernier message: 06/09/2004, 18h13
  2. SOucis avec une reequete imbriquee
    Par Ni4k dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/03/2004, 08h56
  3. souci avec un algorithme
    Par slider16 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 22/03/2004, 17h17
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52
  5. Réponses: 4
    Dernier message: 16/02/2003, 12h16

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