Я хотел бы спросить, подходит ли то, что я делаю, или если есть лучший/более эффективный/более простой способ.
Сценарий:
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");
});
});
}
Мои вопросы:
.flatMap
- это когда некоторое возвращаемое значение функции, которую вы ему даете, возвращает само Promise
. Если все, что вы делаете, это возврат не фьючерсов, то вы можете просто использовать .map
, поэтому последнее .flatMap
, похоже, не должно быть .flatMap
поскольку вы просто обертываете все значения результатов в Promise.pure
, с помощью .map
вы можете просто верните эти значения без дальнейшего бокса в Promise.
Функция, которую вы даете userPromise.flatMap
с другой стороны, вернет Promise
поэтому она должна быть flatMap, иначе она в свою очередь вернет Promise<Promise<Result>>
которую вы не можете вернуть из действия вашего контроллера.
userPromise.flatMap
, поэтому я боюсь, что последний.flatMap
не может быть картой, иначе возвращаемые типы не совпадают. НО: является лиflatMap
на моемholderWithParams.get()
необходимым для использованияStatus
в результате, или это может быть простоmap
? Это та часть, в которой я не совсем уверен, я думал, что это должен быть flatMap из-за выравнивания до одного Обещания дляStatus
.Promise<A>
иA
) единственной разницей междуflatMap
иmap
? Если так, то я действительно мог бы сэкономить последниеflatMaps
, я подумал, что это необходимо, если я хочу повторно использовать возвращенный объект из-за «выравнивания» (что бы это ни значило).