Chaining promises with then and catch

后端 未结 3 1867
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: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);
    

提交回复
热议问题