我有下面的方法,我调用几个reactiveMongorPositories来接收和处理某些文档。因为我对webflux还不太熟悉,所以我边学习边学习。
我觉得下面的代码不是很有效,因为我在同一时间打开多个流。这种无阻塞的代码编写方式使得从流中获取值并在级联平面图中重用该值变得复杂。
在下面的示例中,我必须调用userrepository两次,因为我希望在开始时调用用户,而不是以后。有没有可能用webflux更有效地做到这一点?
public Mono<Guideline> addGuideline(Guideline guideline, String keycloakUserId) {
Mono<Guideline> guidelineMono = userRepository.findByKeycloakUserId(keycloakUserId)
.flatMap(user -> {
return teamRepository.findUserInTeams(user.get_id());
}).zipWith(instructionRepository.findById(guideline.getInstructionId()))
.zipWith(userRepository.findByKeycloakUserId(keycloakUserId))
.flatMap(objects -> {
User user = objects.getT2();
Instruction instruction = objects.getT1().getT2();
Team team = objects.getT1().getT1();
if (instruction.getTeamId().equals(team.get_id())) {
guideline.setAddedByUser(user.get_id());
guideline.setTeamId(team.get_id());
guideline.setDateAdded(new Date());
guideline.setGuidelineStatus(GuidelineStatus.ACTIVE);
guideline.setGuidelineSteps(Arrays.asList());
return guidelineRepository.save(guideline);
} else {
return Mono.error(new InstructionDoesntBelongOrExistException("Unable to add, since this Instruction does not belong to you or doesn't exist anymore!"));
}
});
return guidelineMono;
}
1条答案
按热度按时间2w3kk1z51#
我将把我先前的评论作为答复。如果有人想为它编写正确的代码,那就继续吧。
我没有访问当前ide的权限,因此无法编写示例,但您可以从数据库获取指令开始。
留着吧
Mono<Instruction>
那你去拿你的User
以及flatMap
这个User
去拿那个Team
从数据库。那你呢flatMap
组建一个团队Mono<Tuple>
包括Mono<Tuple<User, Team>>
.然后你拿你的2
Mono
选择和使用zipWith
用一个Combinator
功能和构建Mono<Tuple<User, Team, Instruction>>
你可以平面Map。所以基本上取1个项目,然后取2个项目,然后
Combinate
分为3项。可以使用Tuples.of(...)
功能。