我正在寻找一种仅在另一个承诺失败时才返回承诺的方法。
我怎样才能做到这一点?
我的承诺看起来像这样(当然我已经删除了不相关的代码):
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) }
);
所以这段代码有效,但我很确定应该有更优雅的方式来做到这一点(我认为我的代码看起来更像是一个 hack)。