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?