2017-06-18 3 views
1

J'ai donc ce petit code ci-dessouses6 js promesses: À quoi correspond .catch (callback)?

router.param('username', function (req, res, next, username) 
{ 
    User.findOne({username: username}).then(function (user) 
    { 
     if (!user) 
     { 
      return res.sendStatus(404); 
     } 

     req.profile = user; 

     return next(); 
    }).catch(next); 
}); 

Mon problème est cette partie .catch(next)

Que faut-il faire concrètement? Va-t-il appeler le callback next()? Passera-t-il une erreur dans ce rappel, c'est-à-dire prochaine (erreur)? Ou l'appellera-t-il d'une manière différente comme next (null, error)? Je suis en train de convertir le code ci-dessus en async/await, le code ci-dessous fera-t-il exactement la même chose que le code ci-dessus?

router.param('username', async function (req, res, next, username) 
{ 
    try 
    { 
     let user = await User.findOne({username: username}); 

     if (!user) 
     { 
      return res.sendStatus(404); 
     } 

     req.profile = user; 

     return next(); 
    } 
    catch(error) 
    { 
     next(error); 
    } 
}); 
+2

Oui, votre conversion est exacte. 'next' sera appelé avec l'erreur comme seul argument. – Ryan

+0

Génial. Merci de me l'avoir confirmé. Vous pouvez répondre à la question avec une référence et j'accepterais votre réponse –

+1

pensez à '.catch (next);' comme '.catch (function (reason) {return next (raison);});' –

Répondre

0

Qu'est-ce .catch(callback) équivalent à? Elle est équivalente à .then(null, callback). Ou peut-être que vous pensiez à un eta conversion, auquel cas il est également équivalent à .catch(err => next(err)).

Que va-t-il réellement faire? Appellera-t-il essentiellement le rappel next()?

Oui, c'est ainsi que fonctionnent les rappels.

Passera-t-il une erreur dans ce rappel, c'est-à-dire next(error)?

Oui, lorsque la promesse est rejetée avec cette erreur.

Ou s'appellera-t-il d'une manière différente telle que next(null, error)?

Non, pourquoi pas? J'essaie de convertir le code ci-dessus à async/await, est-ce que ma tentative fera exactement la même chose?

Oui, dans la mesure où .catch est concerné, en supposant que next ne retourne rien.