【发布时间】:2014-08-28 17:29:02
【问题描述】:
我想问一下我做的是否合适,或者有没有更好/更高效/更简单的方法。
场景:
- 用户使用电子邮件地址和密码登录,被路由到 login()-action
- 如果用户已经在数据库中并且密码经过哈希处理,则向数据库用户进行身份验证并返回结果承诺
- 如果用户不在数据库中或没有密码哈希,请使用登录数据执行 Web 服务请求并从响应中解析状态 -> 返回
Status-instance - 检查用户的状态并返回一个结果承诺
代码:
public Promise<Result> login() {
Promise<User> userPromise = Promise.promise(() -> User.findByName(login.emailAddress));
return userPromise.flatMap(user -> {
if (user != null && user.hasPassword()) {
if (user.authenticate(login.password)) {
return Promise.pure(ok("login successful")));
}
// password did not match
return Promise.pure(unauthorized());
}
// user has no password-hash stored, so do a webservice-request instead
final WSRequestHolder holderWithParams =
getWSRequestHolderForUserStatus(login.emailAddress, login.password);
final Promise<Status> statusPromise =
holderWithParams.get().flatMap(this::parseStatusFromResponse);
return statusPromise.flatMap(status -> {
if (status != null) {
if (status.isValid()) {
return Promise.pure(ok("login successful")));
}
// not a valid status, return unauthorized
return Promise.pure(unauthorized());
}
return Promise.pure(badRequest("response parsing error");
});
});
}
我的问题:
- 我是否做错了什么或不必要的事情,如果是:什么是正确、更简单或更有效的方法?
- 我是否了解 Promise 和 flatMaps 的使用,我是在正确使用它还是“过度使用”它?
【问题讨论】:
标签: java playframework playframework-2.0 promise nonblocking