別の promise が失敗した場合にのみpromise を返す方法を探しています。
どうやってやるの?
私が持っている約束は次のようになります(もちろん、関連のないコードは削除しました):
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
- 上記の 2 つのプロミスから解決した人の値を返します。または、両方のプロミスが失敗した場合は、チェーン全体を拒否します。
- 値を指定して呼び出し
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) }
);
したがって、このコードは機能しますが、これを行うためのよりエレガントな方法があるはずです (私のコードはハックのように見えると思います)。