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 :

node, promises et catch


Sujet :

NodeJS

  1. #1
    Membre à l'essai Avatar de natalia.f
    Femme Profil pro
    Développeur Web
    Inscrit en
    novembre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : novembre 2018
    Messages : 12
    Points : 21
    Points
    21
    Par défaut node, promises et catch
    bonjour,

    j essaye de chainer des promises dans node.js, mais je ne comprends pas le fonctionnement de .catch(), voici mon 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
    var chainedPromise = promise1.then(promise1).then(promise2);
     
    if (toto) {
        chainedPromise = chainedPromise.then(promise3);
    }
     
    chainedPromise
        .then(promise4)
        .then(promise5)
        .then(function() {
            res.render('/page1');
        })
        .catch(function() {
            res.render('/page2');
        });
    pour précision:

    - la plupart des promises font des requêtes a la bdd (avec mongodb)

    - certaines utilisent le retour des promises precedente

    - certaines de ces promises lancent des exceptions (throw new Error(...)) dans certains cas

    je pensais que lancer des exceptions/throw dans une chaine de promises arreterai la chaine et passerait dans le block catch. mais ce qui se passe c est que je passe bien dans le block catch, mais la chaine continue !!!!!! par exemple si promise2 renvoit une exception, alors j execute le block catch mais je me rends compte que toutes les then qui suivent se sont aussi executé!

    j ai trouvé sur un autre forum que la solution suivante pourrait marcher:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var chainedPromise = promise1.then(promise2, errorFunction).then(promise3, errorFunction);
     
    if (toto) {
        chainedPromise = chainedPromise.then(promise4, errorFunction);
    }
     
    chainedPromise
        .then(promise5, errorFunction)
        .then(promise6, errorFunction)
        .then(function() {
            res.render('/page1');
        }, errorFunction);
    mais je trouve ca tres tres tres moche lol

    est ce que qqn peut m aider, je ne comprends pas comment gerer les exceptions/reject dans une chaine de promise et toutes les recuperer au meme endroit et sortir de ma chaine ...

    merci d avance pour les propositions, maintenant je vais manger parce que ca fait mal a la tete l asynchrone ^^

  2. #2
    Membre à l'essai Avatar de natalia.f
    Femme Profil pro
    Développeur Web
    Inscrit en
    novembre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : novembre 2018
    Messages : 12
    Points : 21
    Points
    21
    Par défaut
    bon ben j ai trouvé la solution toute seule finalement, pour ceux qui passeraient par la, voici ce qui m a aidé:
    • il ne faut pas lancer des exceptions dans les fonctions asynchrones/promises, mais appeler reject(...)
    • .then(...) ne prend pas de promise en parametre (je croyais pourtant, mais je me suis trompé), et la fonction de callback convertit automatiquement les throw en promesse rejetée (thow = return Promise.reject(...))
    • .catch(...) sur une chaine de promises permet bien de recuperer gerer les differentes erreurs au meme endroit


    donc ça ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    promise1
    	.then(function() { return promise2; })
    	.then(function() { return promise3; })
    	.then(function() { return promise4; })
    	.catch(function(err) { ... });
    et voila je met en resolu!

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

Discussions similaires

  1. [try-catch] relancer les instruction du bloc try
    Par nounou dans le forum Langage
    Réponses: 11
    Dernier message: 12/05/2004, 11h23
  2. [HttpClient] comportement bizarre, saute des catch()...
    Par iubito dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 04/02/2004, 15h25
  3. []générer et LIRE du xml avec vb: sélection d'un node
    Par chris21 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 19/09/2003, 13h14
  4. template match="node() mais pas text()"
    Par Manu_Just dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 26/03/2003, 10h52
  5. Exception & Try..catch
    Par PurL dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/12/2002, 15h35

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