【发布时间】:2014-09-22 12:49:04
【问题描述】:
我正在寻找一种方法来返回一个承诺只有在另一个承诺失败时。
我该怎么做?
我的承诺看起来像这样(当然我已经删除了不相关的代码):
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 btw)
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) }
);
所以这段代码工作,但我很确定应该有更优雅的方式来做到这一点(我认为我的代码看起来更像是一个黑客)。
【问题讨论】:
标签: javascript promise es6-promise