gpt4 book ai didi

java - 如何将上一步中的 Mono<> 结果传递到下一个 doOnSuccess() 方法

转载 作者:行者123 更新时间:2023-12-01 17:41:33 24 4
gpt4 key购买 nike

假设我有一个方法addVoteToSong,例如:

public Mono<Map<Song, VoteKind>> addVoteToSong(Principal principal, String songId, VoteKind voteKind) {
return
userRepository.findUserByUsername(principal.getName())
.doOnSuccess(song -> songRepository.findSongById(songId))
.doOnSuccess(vote -> voteRepository.add(Vote.builder().song()))
.//(the rest of the code)
}

我想传递以下行的结果:

userRepository.findUserByUsername(principal.getName())

.doOnSuccess(song -> songRepository.findSongById(songId))

到行中的构建对象:

.doOnSuccess(vote -> voteRepository.add(Vote.builder().song(here result from findSongById).user(here result from findUserByUsername))

问题来了,是否可以在下一个 doOnSuccess 方法中重用之前的 API 调用结果,或者我应该同时拆分 find API 调用,放弃 Reactor 的级联操作?在互联网上,我找到了使用单个 save 方法的示例,而不基于 react 流的间接结果,这就是出现问题的原因。我将不胜感激有关如何实现目标的建议。

最佳答案

马丁,

首先,请注意 .doOnXXXjust callbacks这将在某些存档条件下执行。您应该避免将业务逻辑放入其中。

回到问题,我想到的第一个想法是从 zip 运算符中受益。因此,您必须放置 2 个发布者 .findUserByUsername.findSongById 并使用 BiFunction 组合结果。所以你可以尝试以下方法:

public Mono<Map<Song, VoteKind>> addVoteToSong(Principal principal, String songId, VoteKind voteKind) {
return Mono
.zip(
userRepository.findUserByUsername(principal.getName()),
songRepository.findSongById(songId),
(user, song) -> voteRepository.add(Vote.builder().song(song).user(user).build())
)
.flatMap(Function.identity())
// your code is here
}

关于java - 如何将上一步中的 Mono<> 结果传递到下一个 doOnSuccess() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60495321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com