関数に次のロジックが必要です。
- パスポートを使用して Facebook でログインし、メソッドを呼び出して Facebook ID を持つユーザーを取得します。
- ユーザーが存在する場合は完了です。
- それ以外の場合は、メソッドを呼び出して、メールでユーザーを取得します。
- ユーザーが存在する場合は、Facebook ID でユーザーを更新する必要があり、完了です!
- ユーザーが存在しない場合は、メールと Facebook ID を使用してアカウントを作成する必要があります。
たとえば、Java では次のようになります。
try {
User user = userService.findByFacebookAccount(id);
if(user != null) {
done(user);
} else {
user = userService.findByEmail(email);
if(user != null) {
user.setFacebookAccount(id);
if(userService.update(user)) {
done(user); // Update with success
} else {
throws new Exception();
}
} else {
user = userService.createByFacebookAccount(name, email, facebook_id);
if(user != null) {
done(user);
} else {
throws new Exception();
}
}
}
} catch(Exception e) {
done(e);
}
Promises でそれを整理するにはどうすればよいですか? ブルーバードの約束を使用して次のようにしました:
function(accessToken, refreshToken, profile, done) {
var profileInfos = profile._json;
userService.findByFacebookAccount(profileInfos.id).then(function(user) {
done(null, user);
}).error(function(e) {
return userService.findByEmail(profileInfos.email);
}).then(function(user) {
user.set('facebook_account', profileInfos.id);
return userService.update(user, ['facebook_account']);
}).then(function(user) {
done(null, user);
}).error(function(e) {
return userService.createByFacebookAccount(profileInfos.name, profileInfos.gender, profileInfos.username, profileInfos.email, profileInfos.id);
}).then(function(user) {
done(null, user);
}).catch(function(e) {
done(null);
});
}
「userService.update(user, ['facebook_account']);」を返すときだから間違っていると思います エラーをキャッチしてエラーを返す必要があり、ユーザーを作成しないでください。
sync ロジックから promise に変換する最良の方法は何ですか?