Я ищу способ вернуть обещание только в случае сбоя другого обещания.
Как я могу это сделать?
Обещания, которые у меня есть, выглядят так (конечно, я удалил несвязанный код):
getUserByUsername = function(username) {
return promise(function(resolve, reject) {
user = userModel.getByUsername(username);
if ( user ) { resolve(user); } else { reject("user not found"); }
});
};
getUserByEmail = function(email) {
return promise(function(resolve, reject) {
user = userModel.getByEmail(email);
if ( user ) { resolve(user); } else { reject("user not found"); }
});
};
checkPassword = function(user, password) {
return promise(function(resolve, reject) {
if ( user.isValidPassword(password) ) { resolve() } else { reject("password mismatch"); }
});
};
И я хочу объединить их в следующей последовательности
- Позвоните
getUserByUsername
, а если откажет, позвонитеgetUserByEmail
- Верните значение того, кто разрешает два обещания выше, ИЛИ, если оба обещания не работают, отклоните всю цепочку.
- Вызовите
checkPassword
со значением и, если он отклонит, отклоните всю цепочку
До сих пор я сделал это, и это, кажется, работает. (кстати, я использую when.js)
getUserByUsername(usernameOrEmail)
.then(
function(user) { return user; },
function() { return getUserByEmail(usernameOrEmail) }
)
.then( function(user) { return checkPassword(user, password) } )
.done(
function() { console.log('success'); },
function(err) { console.log('failure', err) }
);
Итак, этот код работает, но я уверен, что должен быть более элегантный способ сделать это (я думаю, что мой код больше похож на хак).