Когда вы видите учебные пособия по реакторам, они показывают вам очень простые примеры, например.
Код: Выделить всё
return userRepository.findById(1);
но Я хочу сказать, что в реальных приложениях мы имеем дело с несколькими объектами, как показано ниже. код, который я написал в реакторе. Приношу извинения за плохой код, я все еще учусь.
Код: Выделить всё
public Mono response(ServerRequest serverRequest) {
return
Mono.just(new UserRequest())
.map(userRequest -> {
Optional name = serverRequest.queryParam("name");
if (name.isPresent() && !name.get().isEmpty()) {
userRequest.setName(name.get());
return userRequest;
}
throw new RuntimeException("Invalid name");
})
.map(userRequest -> {
Optional email = serverRequest.queryParam("email");
if (email.isPresent() && !email.get().isEmpty()) {
userRequest.setEmail(email.get());
return userRequest;
}
throw new RuntimeException("Invalid email");
})
.map(userRequest -> {
userRequest.setUuid(UUID.randomUUID().toString());
return userRequest;
})
.flatMap(userRequest ->
userRepository
.findByEmail(userRequest.getEmail())
.switchIfEmpty(Mono.error(new RuntimeException("User not found")))
.map(user -> Tuples.of(userRequest, user))
)
.map(tuple -> {
String cookiePrefix = tuple.getT2().getCode() + tuple.getT1().getUuid();
return Tuples.of(tuple.getT1(), tuple.getT2(), cookiePrefix);
})
//Some more chaining here.
.flatMap(tuple ->
ServerResponse
.ok()
.cookie(ResponseCookie.from(tuple.getT3(), tuple.getT2().getRating()).build())
.bodyValue("Welcome")
);
}
затем мне нужны некоторые данные из базы данных и так далее, реактивная цепочка продолжает работать.Теперь рассмотрим
- объект UserRequest из первого метода цепочки и
- документ пользователя, полученный из базы данных
>тогда я сделаю гораздо больше операций, но в конце цепочки мне нужны оба этих объекта для обработки окончательного ответа.
Единственный способ добиться того, что я нашел в Google, - это Tuple.
но после этого код выглядит более грязным, поскольку в каждое следующее действие, которое мне нужно сделать
Код: Выделить всё
tuple.getT()
Код: Выделить всё
tuple.getT2()
Подробнее здесь: https://stackoverflow.com/questions/627 ... in-reactor