Chaining promises with then and catch

后端 未结 3 1868
Happy的楠姐
Happy的楠姐 2020-12-05 04:38

I\'m using the bluebird Promise library. I\'d like to chain promises and catch specific promises errors. Here\'s what I\'m doing :

getSession(sessionId)
  .c         


        
相关标签:
3条回答
  • 2020-12-05 05:27

    Since you're using bluebird for promises, you actually don't need a catch statement after every function. You can chain all your thens together, and then close the whole thing off with a single catch. Something like this:

    getSession(sessionId)
      .then(function (session) {
        return getUser(session.user_id);
      })
      .then(function (user) {
        req.user = user;
        next();
      })
      .catch(function(error){
        /* potentially some code for generating an error specific message here */
        next(error);
      });
    

    Assuming the error messages tell you what the error is, it's still possible to send an error specific message like 'session not found' or 'user not found', but you'll just have to look into the error message to see what it gives you.

    Note: I'm sure you probably have a reason for calling next regardless if there's an error or not, but it might be useful to throw in a console.error(error) in the case that you get an error. Alternatively, you could use some other error handling function, whether it's a console.error, or res.send(404), or something of the like.

    0 讨论(0)
  • 2020-12-05 05:29

    The promise that is returned by the .catch method will still be resolved with the result of the callback, it doesn't just stop the propagation of the chain. You will either need to branch the chain:

    var session = getSession(sessionId);
    session.catch(function (err) { next(new Error('session not found')); });
    var user = session.get("user_id").then(getUser);
    user.catch(function (err) { next(new Error('user not found')); })
    user.then(function (user) {
        req.user = user;
        next();
    });
    

    or use the second callback to then:

    getSession(sessionId).then(function(session) {
        getUser(session.user_id).then(function (user) {
            req.user = user;
            next();
        }, function (err) {
            next(new Error('user not found'));
        });
    }, function (err) {
        next(new Error('session not found'));
    });
    

    Alternatively, the better way would to just propagate the errors through the chain, and call next only in the very end:

    getSession(sessionId).catch(function (err) {
        throw new Error('session not found'));
    }).then(function(session) {
        return getUser(session.user_id).catch(function (err) {
            throw new Error('user not found'));
        })
    }).then(function (user) {
        req.user = user;
        return null;
    }).then(next, next);
    
    0 讨论(0)
  • 2020-12-05 05:36

    I am using it like that:

    getSession(x)
    .then(function (a) {
        ...
    })
    .then(function (b) {
        if(err){
            throw next(new Error('err msg'))
        }
        ...
    })
    .then(function (c) {
        ...
    })
    .catch(next);
    
    0 讨论(0)
提交回复
热议问题