Как упростить глубокие вложенные обещания

Я сталкивался с ситуацией, когда мне нужно нарушать каждый пункт «еще» вthen()и это выглядит не лучше, чем вложенные обратные вызовы, это процесс входа в систему:

User.findOne({
    username: username
}).exec()
    .then(user => {
        if (user) {
            return user.verifyPassAsync()
                .then(matched => {
                    if (matched) {
                        return User.getBriefProfile(username))
                            .then(emp => {
                                if (emp) {
                                    return saveToSession(emp);
                                } else {
                                    //return 
                                }})
                    } else {
                        //return ...
                    }})
        } else {
        // return false
        }
    })

Есть ли способ, которым я могу упростить это?

Ответы на вопрос(1)

Ваш ответ на вопрос