我想询问我所做的事情是否合适,或者是否有更好/更有效/更简单的方式。
情境:
Status
- 实例代码:
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");
});
});
}
我的问题:
答案 0 :(得分:2)
.flatMap
用于当您为其提供的函数的某些返回值本身返回Promise
时。如果您所做的只是返回非期货,那么您可以使用.map
,因此最后.flatMap
似乎不需要是.flatMap
,因为您只需将所有结果值包装在Promise.pure
,使用.map
,您只需返回这些值,而无需在Promise中进一步装箱。
另一方面,您向userPromise.flatMap
提供的函数将返回Promise
,因此它必须是flatMap,否则它将返回Promise<Promise<Result>>
,您无法从控制器返回动作。