我有一个用kotlin写的web应用程序。这是一种有点不和谐的聊天。我有一个函数可以做很多事情。该函数本身用于删除用户的帐户,但在执行此操作时,它也会删除他曾经从数据库中注销的消息,他会从数据库中的所有组中删除,并且在他作为管理员的组中会选择一个新的管理员。
这个函数看起来是这样的:
fun deleteAccount(userId: String) : Flux<Void>{
return groupRepository.findAllByAdmin(userId)
.flatMap{
if(it.users.size<1) groupRepository.deleteById(it._id)
it.admin = it.users[0]
it.users.remove(userId)
groupRepository.save(it)
}
.flatMap {
messageRepository.deleteMessageByUserId(userId)
userRepository.deleteById(userId)
}
}
我的存储库如下所示:
@Repository
interface GroupRepository : ReactiveCrudRepository<GroupRequest, String> {
fun findByName(name: String): Mono<GroupRequest>
fun existsByName(name: String): Mono<Boolean>
fun findAllByAdmin(admin:String) : Flux<GroupRequest>
}
@Repository
interface MessageRepository : ReactiveCrudRepository<Message, String> {
fun findMessageByGroupId(groupId: String): Flux<Message>
fun deleteMessageByUserId(userId:String) : Mono<Void>
}
所以函数中的最后两个语句返回一个void mono。问题是,先执行哪条语句并不重要,只执行这两条语句中的一条,我现在尝试了几种方法,包括 Flux.zip
它不完全起作用。如果我将deletemessages放在第一位,那么除了数据库中删除用户的部分之外,其他部分都可以工作。此函数中的问题在哪里?如何修复?
2条答案
按热度按时间fhity93d1#
我通过压缩第二个平面图中的两个语句来修复它,如下所示:
omjgkv6w2#
你可能在找
Mono.when()
如果你只关心完成信号。