Chaining promises with then and catch

bluebird, javascript

Solution

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);

Problem

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) .catch(function (err) { next(new Error('session not found')); }) .then(function (session) { return getUser(session.user_id); }) .catch(function (err) { next(new Error('user not found')); }) .then(function (user) { req.user = user; next(); }); ``` But if an error is thrown by `getSession`, the two `catch` are called, as well as the second `then`. I'd like to stop the error propagation at the first `catch`, so that the second `catch` is only called when `getUser` throws, and the second `then` when `getUser` succeeds. What do?

Original source